我必须编写一个递归函数,它在输入中获取一个数字列表,并在输出中返回一个数字列表,例如这样称为:
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)
但我收到的错误对我来说没有任何意义。 递归应始终取数字,并将其添加到前面的数字,而不是将其保存在列表的下一个位置..(新的或原始的)
答案 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 k
将k
声明为全局。当然,每次你要使用这个函数时你需要重置{{1}},这将是一个有点奇怪的API。