Python 列表递归更改

标签 python list recursion return tail-recursion

我在尝试以递归方式向列表中添加一系列数字时遇到错误。例如。如果输入是 [5,3,9],我做 [5+1,3+2,9+3] 并输出 [6,5,12]。我想递归地执行此操作,所以我这样做的方式是遍历并将一个添加到列表的越来越小的部分,如下所示:

def add_position_recur(lst, number_from=0):
    length = len(lst)
    # base case
    if (length <= 1):
        lst = [x+1 for x in lst]
        print "last is", lst
    else:
        lst = [x+1 for x in lst]
        print "current list is", lst
        add_position_recur(lst[1:], number_from)
        return lst

但是,问题在于所有这一切只是将列表的每个元素加 1。错误在哪里?这与我在基本情况下返回列表的方式有关吗?

最佳答案

当你向下递归你的调用堆栈时,你切片 lst 创建一个新列表,这与你返回的不一样,所以你只会返回你应用到你的更改在第一次调用该函数时列出,丢失堆栈中的所有更改:

>>> add_position_recur([1,2,3])
[2, 3, 4]

这应该返回 [2, 4, 6]
您需要考虑在退出时重新组合列表以获取更改。

return [lst[0]] + add_position_recur(lst[1:], number_from)

并且您需要在基本情况下返回 lst:

def add_position_recur(lst, number_from=0):
    length = len(lst)
    # base case
    if (length <= 1):
        lst = [x+1 for x in lst]
        return lst
    else:
        lst = [x+1 for x in lst]
        return [lst[0]] + add_position_recur(lst[1:], number_from)
>>> add_position_recur([1,2,3])
[2, 4, 6]

但是,这是一种相当复杂的递归方法。基本情况是空列表是惯用的,否则取头部并递归到尾部。所以需要考虑使用 number_from 的东西:

def add_position_recur(lst, number_from=1):
    if not lst:
        return lst
    return [lst[0]+number_from] + add_position_recur(lst[1:], number_from+1)

>>> add_position_recur([1,2,3])
[2, 4, 6]

这也有好处(?)不改变传入的 lst

关于Python 列表递归更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32514605/

相关文章:

python - 使用 NetworkX 和 Matplotlib 促进网络增长

python re.split 不适用于所有领域

list - 在自己的行上打印列表的所有项目

algorithm - 阶乘新算法的递归方程

java - 无法弄清楚为什么递归永远无法解决

python - 如何在我的 Discord 机器人中正确解析标记用户?

python - 如何从可迭代的保持原始索引中枚举选定的元素?

python - 将函数应用于列的所有元素(字符串列表)以转换为 float

python - 嵌套列表中特定项目的求和

recursion - 从 F# 列表中删除