【发布时间】:2021-11-08 03:20:12
【问题描述】:
我想用递归函数对数字求和,即
getSum([1, 2, 3, 4, 5])
应该返回 1+2+3+4+5 == 15
我不是递归函数方面的专家,我尝试过类似的方法:
def getSum(piece):
for i in piece
suc += getSum(i)
问题是我不能循环遍历整数。我敢肯定这是一个很容易的任务,但我真的想不通。
【问题讨论】:
我想用递归函数对数字求和,即
getSum([1, 2, 3, 4, 5])
应该返回 1+2+3+4+5 == 15
我不是递归函数方面的专家,我尝试过类似的方法:
def getSum(piece):
for i in piece
suc += getSum(i)
问题是我不能循环遍历整数。我敢肯定这是一个很容易的任务,但我真的想不通。
【问题讨论】:
你不需要循环。递归将为您做到这一点。
def getSum(piece):
if len(piece)==0:
return 0
else:
return piece[0] + getSum(piece[1:])
print getSum([1, 3, 4, 2, 5])
【讨论】:
我认为不明确检查长度会更好一些:
def getSum(piece):
return piece[0] + getSum(piece[1:]) if piece else 0
演示:
>>> getSum([1, 2, 3, 4, 5])
15
【讨论】:
出于学术目的(学习 Python),您可以使用递归:
def getSum(iterable):
if not iterable:
return 0 # End of recursion
else:
return iterable[0] + getSum(iterable[1:]) # Recursion step
但您不应该在实际生产代码中使用递归。与使用内置插件相比,它效率不高,代码也不那么清晰。对于这种情况,您既不需要递归也不需要循环。只需使用内置的sum:
>>>a = [1, 2, 3, 4, 5]
>>>sum(a)
15
【讨论】:
你也可以使用reduce。 函数 reduce(func, seq) 不断地将函数 func() 应用于序列 seq。它返回一个值。
reduce(lambda x,y: x+y, range(1,6))
【讨论】:
或者,以更“Pythonic”的方式:
suml = lambda l: l[0] + suml(l[1:]) if l else 0
print(suml(range(101)))
【讨论】:
使用递归和弹出函数
def getSum(piece):
return piece.pop() + getSum(piece) if piece else 0
【讨论】:
如果您的列表比简单列表更复杂,例如:
mylist = [1,-10,[[2,[3]],7.3],[[[[[[[[[-5]]]],2]]],1],4]]
你应该使用这个代码:
mylist = [1,-10,[[2,[3]],7.3],[[[[[[[[[-5]]]],2]]],1],4]]
def getSum(piece):
if len(piece)==0:
return 0
elif type(piece[0]) is list:
return getSum(piece[0]) + getSum(piece[1:])
else:
return piece[0] + getSum(piece[1:])
print(getSum(mylist))
【讨论】: