-1

可能重复:
调用 func。改变输入

我必须编写一个递归函数,该函数接受输入中的数字列表并在输出中返回数字列表,例如这样调用:

rec_cumsum([2,2,2,3])

输出应该是这样的:

[2,4,6,9]

问题是,我似乎无法解决这个问题..这让我质疑我的整个递归思维..到目前为止我所拥有的是:

newlist = []
k = 1
def rec_cumsum(numbers):
    if len(numbers) == 0:
        return 0
    if len(numbers) > 1 and len(numbers) != (k+1):
        newlist[k+1] == newlist[k+1] + newlist[k]
        k = k+1
        return rec_cumsum(numbers)

但我遇到了对我来说没有任何意义的错误。递归应始终采用该数字,并将其添加到它之前的数字,而不是将其保存在列表的下一个位置..(新的或原始的)

4

1 回答 1

3

我会这样写:

def cumulative_sum(lst,prev=0):
    if not lst:
        return []
    else:
        elem = prev+lst[0]
        return [elem] + cumulative_sum(lst[1:],prev=elem)

print cumulative_sum([2,2,2,3])

现在查看您的代码(请注意,我实际上并没有通过逻辑来决定它是否会给出正确的结果,以下仅解决您的代码可能抛出的可能异常):

由于这一行,您可能会收到 IndexError :

newlist[k+1] == newlist[k+1] + newlist[k]

您正在分配一个尚不存在的列表位置。您可以预先分配您的列表:

newlist = [0]*len(lst)

但即使你解决了这个问题,你的代码也会因为以下行而出现递归错误:

k = k + 1

这里的问题是左侧k是局部的,而右侧k是全局的。所以基本上每次你运行它时,你得到的是本地的k == 2,而不是全局的。如果真的要修改全局k,需要通过声明k为全局global k。当然,k每次使用这个函数时都需要重新设置,这将是一个有点奇怪的 API。

于 2012-11-16T19:14:12.257 回答