我正在尝试编写一个函数,将列表中的所有数字相加,但通过在 Python 中调用自身。这是我的意思的一个例子:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
您将如何使用它来查找列表的总和?
nums = [1, 3, 2, 8, 9]
def rec_sum(nums):
if not nums: return 0
return nums[0] + rec_sum(nums[1:])
>>> rec_sum(nums)
23
你甚至可以在一行中做到这一点:
def rec_sum(nums):
return nums[0] + rec_sum(nums[1:]) if nums else 0
为了避免nums[1:]
在每次调用时生成列表的所有浅表副本,您可以做一些更有效的事情:
def rec_sum(nums, i=0):
if i >= len(nums): return 0
return nums[i] + rec_sum(nums, i+1)
使用Y-Combinator也很有趣
>>> Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
>>> rec_sum = lambda f: lambda nums: nums[0] + f(nums[1:]) if nums else 0
>>> Y(rec_sum)(nums)
23