Python 递归类fibonnaci累积

Python 递归类fibonnaci累积,python,recursion,Python,Recursion,可能重复: 我必须编写一个递归函数,它在输入中获取一个数字列表,在输出中返回一个数字列表,例如,调用如下: rec_cumsum([2,2,2,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 cumu

可能重复:

我必须编写一个递归函数,它在输入中获取一个数字列表,在输出中返回一个数字列表,例如,调用如下:

rec_cumsum([2,2,2,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])
输出应如下所示:

[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)
但我会犯错误,这对我来说毫无意义。
递归应该始终获取数字,并将其添加到前面的数字,然后将其保存到列表的下一个位置。。(新的还是原来的)

我会这样写:

rec_cumsum([2,2,2,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])

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

您可能因为这一行而得到索引器:

newlist[k+1] == newlist[k+1] + newlist[k]
您正在分配给一个尚不存在的列表位置。您可以预先分配您的列表:

newlist = [0]*len(lst)
但是,即使您解决了这个问题,您的代码也会出现递归错误,因为行:

k = k + 1

这里的问题是,在左侧,
k
是局部的,而在右侧,
k
是全局的。因此,基本上每次运行它时,都会得到局部的
k==2
,而不是全局的。如果确实要修改全局
k
,则需要通过
global k
k
声明为全局。当然,每次使用这个函数时都需要重置
k
,这可能是一个有点奇怪的API

为了理解递归思维,你必须理解递归思维:)这句话,“但我会犯错误,这对我来说没有任何意义”。您应该确切地说明错误是什么。允许这样做吗?它涉及更改方法签名,尽管是以隐藏的方式way@JasonSperske”“我不知道。这不是我的家庭作业。改变函数签名是最简单的方法(据我所知)——虽然我不是一个真正的函数程序员,所以可能有更好的方法——我越努力,越觉得你是对的(关于方法签名),你的解释为我敲定了交易(你显然赢得了29.6K的声誉:)@JasonSperske——这个问题的重复链接中被接受的解决方案在不改变签名的情况下成功地做到了这一点。(如果你问我,这很聪明)。但该解决方案需要检查两个基本情况,我发现当python支持默认参数时,这两个基本情况就不那么优雅了。如果确实需要避免签名更改,则始终可以将此函数包装在外部函数中,并调用内部函数。。