为什么在递归中乘以一个和不同于乘以单个整数然后求和?

2024-09-27 00:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解决以下问题:我们得到一个嵌套的整数列表,我们想要找到乘积和。积和就是数的和,但是对于嵌套列表中的数,我们需要将它们与嵌套深度相乘

例如:array=[2,5,[7,-1]]->;输出=19###2+5+2*(7+-1)

下面是一个正确的递归解决方案:

def productSum(array, multiplier = 1):
    total_sum = 0 
    for i in range(len(array)): 
        if isinstance(array[i],int): 
            total_sum += array[i]
        else: 
            total_sum += productSum(array[i],multiplier+1)
    
    return total_sum *multiplier    

然而,当我最初编写我的解决方案时,我没有将*乘数放在返回的末尾,而是将乘数放在“if”语句中,因此我的解决方案是:

def productSum(array, multiplier = 1):
    total_sum = 0 
    for i in range(len(array)): 
        if isinstance(array[i],int): 
            total_sum += array[i] * multiplier
        else: 
            total_sum += productSum(array[i],multiplier+1)

    return total_sum

我只是想理解为什么我上面的解决方案不能产生期望的结果,因为我的理解是它们是相同的,因为在每个递归调用中“乘法器”是固定的,那么为什么我用乘法器乘以整数然后求和,而不是求和整数然后用乘法器相乘呢???如果我正确理解以上内容,这就是两者的区别

举个例子,输入:array:[5,2,7,1,3,6,13,8,4]],第一个解产生27个,这是正确的,而第二个解产生12个,这是错误的


Tags: in列表forlenifdefrange整数
1条回答
网友
1楼 · 发布于 2024-09-27 00:14:53

问题是,在初始解决方案中,您没有将productSum(array[i],multiplier+1)乘以乘数

如果只想将数值相乘,则乘法器需要是深度级别的阶乘,因为乘法相互叠加

例如:

[5, 2, [7, -1], 3, [6, [-13, 8], 4]]

计算为:

5 + 2 + 2*(7 + -1) + 3 + 2*(6 + 3*(-13 + 8) + 4)

传播乘法:

5 + 2 + 2*7 + 2*-1 + 3 + 2*6 + 2*3*-13 + 2*3*8 + 2*4

请注意,-13和8乘以2和3(而不是像初始代码那样仅乘以3)

顺便说一句,您可以在理解上使用sum函数,而不是for循环

# like 'correct' solution:        depth * ∑ recursion | value
def productSum(a,d=1):
    return d*sum(productSum(n,d+1) if isinstance(n,list) else n for n in a)

# like initial solution (fixed):  ∑ depth * (recursion | value)
def productSum(a,d=1):
    return sum(productSum(n,d+1)*d for n in a) if isinstance(a,list) else a 

# or factorial approach:          ∑ (recursion | value * depth!)
def productSum(a,d=1,m=1):
    return sum(productSum(n,d+1,m*d) for n in a) if isinstance(a,list) else a*m

相关问题 更多 >

    热门问题