递归的斐波那契样累积

时间:2012-11-16 19:04:47

标签: python recursion

  

可能重复:
  calling func. change the input

我必须编写一个递归函数,它在输入中获取一个数字列表,并在输出中返回一个数字列表,例如这样称为:

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)

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

1 个答案:

答案 0 :(得分: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])

现在看一下你的代码( note 我实际上没有通过逻辑来决定它是否会给出正确的结果,以下只解决你的代码可能抛出的可能异常) :

你可能因为这行而得到一个IndexError:

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

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

newlist = [0]*len(lst)

但是即使你修复了这个问题,由于这行代码,你的代码会出现递归错误:

k = k + 1

这里的问题是,在左侧,k是本地的,而在右侧,k是全局的。所以基本上每次运行时,你都会获得本地k == 2而不会触及全局本地k。如果您确实要修改全局k,则需要通过global kk声明为全局。当然,每次你要使用这个函数时你需要重置{{1}},这将是一个有点奇怪的API。