如何使用递归将嵌套数字列表的总和相加?我该如何使用迭代来做到这一点?

How would I add the sum of a nested list of numbers using recursion? How would I do it using iteration?

提问人:Kaia 提问时间:11/3/2023 更新时间:11/3/2023 访问量:80

问:

我需要编写两个函数来查找嵌套数字列表的总和,一个使用迭代,另一个使用递归。

我已经编写了两个函数,它们成功地找到了非嵌套数字列表的总和,但我不确定如何使它们通过嵌套列表。

这是我目前所拥有的:

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]

python-3.x 嵌套列表

评论


答:

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

演示:https://ideone.com/AZqYWX