Python 递归中的列表追加
我不会做帕斯卡三角形。我需要在递归中追加到列表元素,但我的工作结果是在列表中追加列表。你能帮我做吗? 我的测试代码是:Python 递归中的列表追加,python,list,recursion,append,Python,List,Recursion,Append,我不会做帕斯卡三角形。我需要在递归中追加到列表元素,但我的工作结果是在列表中追加列表。你能帮我做吗? 我的测试代码是: def list(row): if(row is 0): return 0 return [row, list(row-1)] 如果我使用它,我将返回列表中的列表。我需要列表中的元素 print(list(10)) 输出: [10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]] 预期产出:
def list(row):
if(row is 0):
return 0
return [row, list(row-1)]
如果我使用它,我将返回列表中的列表。我需要列表中的元素
print(list(10))
输出:
[10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]]
预期产出:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
听起来您想将列表
[x]
与调用list(x-1)
返回的列表连接起来。python中列表的好处在于,+
操作符正是这样做的。如果我们将最终return语句更改为return[x]+list(x-1)
,那么我们的方向是正确的。然后,您会注意到,当x为0时会遇到问题,因为您无法将列表添加到整数中,因此您需要将基本大小写更改为返回[0]
。最后,如前所述,最好避免声明覆盖python内置函数的名称(list
就是其中之一),因此让我们将函数重命名为my_list
:
def my_list(row):
if row == 0:
return [0]
return [row] + my_list(row-1)
这并不能让你完全理解帕斯卡三角形,但希望你走上了正确的道路。你想要的可能是:
return [row] + list(row-1)
这将创建一个包含一个元素
行的列表,并在其顶部添加另一个列表。关于您的特定功能,这里有一种编写方法
def foo (row):
if row == 0:
return [0]
else:
return [row] + foo (row - 1)
print(foo(10))
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
也许更“蟒蛇式”的写作方式是
print([10 - x for x in range (0, 11)])
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
关于pascal的三角形,这里有一种方法可以使用辅助助手和延续传递样式编写程序——对于那些想知道的人来说,这个选择是为了以一种简单的方式组装结果,递归调用处于尾部位置,这意味着,如果有必要,这个功能可以很容易地放在蹦床上,以确保堆栈安全
def sliding (n,xs):
if n > len(xs):
return []
else:
return [xs[0:n]] + sliding(n, xs[1:])
def pascal (n):
def aux (m, prev, k):
if n == m:
return k([prev])
else:
return aux(m + 1, [1] + [x + y for (x,y) in sliding(2, prev)] + [1], lambda rest: k([prev] + rest))
return aux(1, [1], lambda x: x)
for line in pascal(5):
print(line)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
您可以创建一个递归范围函数,以输出预期结果:
def rec_range(n):
return [n] + rec_range(n-1) if n else [0]
>>> rec_range(10)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
希望能有帮助
或者只需使用python2.x中的range
(xrange
):
您可以使用给定的方法创建Pascal三角形
def pascal(rows):
for i in range (rows):
value=1
List = [value]
for j in range (i):
value = value * ( i-j ) * 1 / ( j + 1 )
List.append(int(value))
print(List)
pascal(5)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
应该使用递归。list
在python中是一个保留字,请为您的函数使用不同的名称。您可以提供输入和预期的输出吗?它不会改变任何内容。@Szabolcs是的,我已经编辑过alreadyThank了。非常有用,谢谢。这个答案也很有帮助。应该使用递归。这是一项任务。
def pascal(rows):
for i in range (rows):
value=1
List = [value]
for j in range (i):
value = value * ( i-j ) * 1 / ( j + 1 )
List.append(int(value))
print(List)
pascal(5)
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]