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]
我在尝试以递归方式向列表中添加数字序列时遇到错误。例如。如果输入是 [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]