心雨\星愿^ 2021-08-22 17:27 采纳率: 100%
浏览 378
已结题

Python程序设计浙大版6-4列表数字元素加权求和

题目如下:
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。也就是说,每一层的数字元素都要乘以他所在的层数。
例如:
输入:[1,2,[3,4,[5,6],7],8]
输出:72
过程:72=1x1+2x1+3x2+4x2+5x3+6x3+7x2+8x1

正确做法如下:


def f(l, p):
    s = 0
    if type(l) == int:
        s += p*l
    if type(l) == list:
        p += 1
        for i in l:
            s += f(i, p)
    return s

l = eval(input())
print(f(l, 0))

我的做法如下:


def f(l, p):
    s = 0
    for i in l:
        if type(i) == int:
            s += i*p
        if type(i) == list:
            p += 1
            s += f(i, p)
    return s

l = eval(input())
print(f(l, 1))

请问为什么我把循环放在外面结果就是错误的?这两种写法有什么区别吗?
(以输入样例为例,不考虑其它输入,错误做法不会抛出错误,结果为87)

  • 写回答

2条回答 默认 最新

  • bekote 2021-08-22 17:53
    关注

    因为有bug,p+1应该写在这里s += f(i, p+1),不然在一个子元素是列表时p的值加了1,下一个子元素是int时的乘的p是加了1的p

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 已采纳回答 8月22日
  • 修改了问题 8月22日
  • 创建了问题 8月22日

悬赏问题

  • ¥20 求各位解释一道区间DP
  • ¥15 怎么实现只排序每行中的第二列的数 如果比两数都大就放在第三列中 比两数都小就放在第一列中(语言-c语言)
  • ¥15 应用商店如何检测在架应用内容是否违规?
  • ¥15 Ubuntu系统配置PX4
  • ¥20 MATLAB间接平差计算
  • ¥50 nw.js调用activex
  • ¥15 数据库获取信息反馈出错,直接查询了ref字段并且还使用了User文档的_id而不是自己的
  • ¥15 将安全信息用到以下对象时发生以下错误:c:dumpstack.log.tmp 另一个程序正在使用此文件,因此无法访问
  • ¥15 速度位置规划实现精确定位的问题
  • ¥15 MAC虚拟机(win11)USB插上后无串口com,无法烧录