def sumAll(lis):
return 0 if isEmpty(lis)== True\
else head(lis)+sumAll(tail(lis))
def isEmpty(lis):
return True if lis==0 else False
def head(lis):
return lis[0]
def tail(lis):
return lis[1:]
a=input()
print sumAll(a)
谁能告诉我为什么它不会工作?任何帮助将不胜感激。
答案 0 :(得分:1)
你应该这样做:
return 0 if not lis else head(lis)+sumAll(tail(lis))
而不是:
return 0 if isEmpty(lis) else head(lis)+sumAll(tail(lis))
isEmpty(lis)
始终为False
,因为:
>>> isEmpty([])
False
为什么使用递归?我希望它只是练习递归..
提示:始终使用调试器来真正了解程序的流程并更好地捕获错误。
答案 1 :(得分:1)
使用尾递归:
def sumAll(lis, summed = 0):
if not lis:
return summed
else:
summed += lis[0]
return sumAll(lis[1:],summed)
In [2]: sumAll([1,2,3])
Out[2]: 6
In [3]: sumAll([1,2,3,4,5])
Out[3]: 15
Python没有针对尾递归进行优化,因此在Python中使用它没有任何优势,但在其他语言中可能是有利的,因为它避免了创建多余的堆栈帧,因为该函数返回递归调用的结果。
该函数只调用自身,直到条件为True。
在您的代码中,所有递归调用必须在计算最终总和之前完成。 如果您在pythontutor中运行代码,您将看到差异。
在您的代码更改中:
def isEmpty(lis):
return True if not lis else False # change to "not lis", which is an empty list []
lis
永远不会是== 0
,以检查您可以使用if not lis
的空列表。
def sum_all(lis):
if isEmpty(lis): # same as if is_empty(lis) == True
return 0
else:
return head(lis) + sum_all(tail(lis))
def is_empty(lis):
return not lis
def head(lis):
return lis[0]
def tail(lis):
return lis[1:]
您可以将自己的代码简化为:
def sum_all(lis):
if not lis: # same as if is_empty(lis) == True
return 0
else:
return lis[0] + sum_all(lis[1:])
答案 2 :(得分:0)
如何减少
def sum(container):
if len(container) == 1:
return container[0]
if not container:
return 0
val = container.pop()
container[0] += val
return sum(container)