提问人:Kaia 提问时间:11/3/2023 更新时间:11/3/2023 访问量:80
如何使用递归将嵌套数字列表的总和相加?我该如何使用迭代来做到这一点?
How would I add the sum of a nested list of numbers using recursion? How would I do it using iteration?
问:
我需要编写两个函数来查找嵌套数字列表的总和,一个使用迭代,另一个使用递归。
我已经编写了两个函数,它们成功地找到了非嵌套数字列表的总和,但我不确定如何使它们通过嵌套列表。
这是我目前所拥有的:
def iterative_sum(ls:list):
max = len(ls)
i = 0
num_sum = 0
while i < max:
num_sum += ls[i]
i += 1
return num_sum
def recursive_sum(ls:list):
if len(ls)==0:
return 0
else:
return ls[0] + recursive_sum(ls[1:])
num_list = [1, 5, 4, 3, 2, 10, 5]
print("Iterative sum:", iterative_sum(num_list))
print ("Recursive sum:", recursive_sum(num_list))
它适用于非嵌套列表,但如果我的列表也是这样的,我需要它才能工作:
num_list = [1, 2, [3, 4], [5, [[6, 7], 8]], 9]
答:
1赞
user2390182
11/3/2023
#1
以下内容适用于任意嵌套列表:
def iterative_sum(ls):
# ls = ls[:] # if you want it to be non-destructive
s = 0
while ls:
last = ls.pop()
if isinstance(last, int):
s += last
else:
ls.extend(last)
return s
>>> iterative_sum([1, 2, [3, 4], [5, [[6, 7], 8]], 9])
45
def recursive_sum(ls):
if isinstance(ls, int):
return ls
# return sum(map(recursive_sum, ls))
s = 0
for x in ls:
s += recursive_sum(x)
return s
>>> recursive_sum([1, 2, [3, 4], [5, [[6, 7], 8]], 9])
45
还有另一种使用递归的方法,无需任何迭代和切片:
def recursive_sum(ls, i=0):
if not isinstance(ls, list):
return ls
if i == len(ls):
return 0
return recursive_sum(ls[i]) + recursive_sum(ls, i+1)
评论
0赞
blhsing
11/3/2023
你的递归函数虽然在技术上是递归的,但可能不是 OP 的指导员所想的,因为它实际上是遍历给定的列表。通常,要求学生编写递归函数的作业带有不使用任何循环的限制。
0赞
user2390182
11/3/2023
真。我将保持原样,因为您已经展示了这一点。此外,当我看到重复切片时,有些东西会以错误的方式让我发痒 =) 我认为永远不应该教它,所以我添加了另一种没有切片或迭代的方法。
0赞
blhsing
11/3/2023
没错,我走切片路线是因为OP的示例代码。由于其类似伪代码的外观,它很容易理解,但在其他方面效率低下,除了学习递归的基础知识之外,永远不应该用于其他任何事情。
0赞
Kelly Bundy
11/3/2023
使其无损的另一种方法:ls = [ls]
0赞
blhsing
11/3/2023
#2
使用迭代方法,可以在循环访问主列表时将子列表中的项排入主列表,以便进行进一步的迭代:
def iterative_sum(lst):
s = 0
for i in lst:
if isinstance(i, list):
lst += i
else:
s += i
return s
使用递归方法,可以将递归调用列表中的第一个项目与其余项目分开,直到给定对象为空列表或不是列表:
def recursive_sum(lst):
if not isinstance(lst, list):
return lst
if lst:
return recursive_sum(lst[0]) + recursive_sum(lst[1:])
return 0
评论