Python 列出递归更改

Python list recursive changes

我在尝试以递归方式向列表中添加数字序列时遇到错误。例如。如果输入是 [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。错误在哪里?这与我 return 基本案例中列表的方式有关吗?

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

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

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

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

并且您需要 return 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

你为什么不做这样的事情:

def func(lon, after=[]):
    if not l:
        pass
    else:
        v = len(lon) + lon[-1]
        after.append(v)
        func(lon[:-1], after)
        return after[::-1]

您提供的示例的函数输出符合您的要求。

目前,您只是将列表的每个值加 1。

lst = [x+1 for x in lst]

相反,您应该增加一个变量,该变量随着 lst 中 x 的每次迭代而被添加到 x。

lst = [x+(lst.index(x)+1) for x in lst]

此解决方案假设您希望添加到 x 的数字取决于它在列表中相对于列表开头的位置,而不是取决于 x 相对于第一个元素的位置 > 1.意思是,您要将 1 还是 3 添加到以下列表中的值 2?上面的解决方案增加了三个。

lst = [0.5, 0.1, 2, 3]