python递归pascal三角形
在完成使用迭代函数创建pascal三角形的赋值之后,我尝试使用递归函数重新创建它。我已经到了可以让它生成与作为参数传入的数字对应的单独行的地步。但几次试图让它生成包括该行在内的整个三角形的尝试都失败了。我甚至尝试编写一个单独的函数,该函数在输入数字的范围内进行迭代,并使用迭代的数字调用递归函数,同时在返回列表之前将单独的行追加到列表中。所需的输出应该是一个列表列表,其中每个内部列表包含一行三角形。像这样:python递归pascal三角形,python,recursion,pascals-triangle,Python,Recursion,Pascals Triangle,在完成使用迭代函数创建pascal三角形的赋值之后,我尝试使用递归函数重新创建它。我已经到了可以让它生成与作为参数传入的数字对应的单独行的地步。但几次试图让它生成包括该行在内的整个三角形的尝试都失败了。我甚至尝试编写一个单独的函数,该函数在输入数字的范围内进行迭代,并使用迭代的数字调用递归函数,同时在返回列表之前将单独的行追加到列表中。所需的输出应该是一个列表列表,其中每个内部列表包含一行三角形。像这样: [[1], [1, 1], [1, 2, 1]...] def triangle(n):
[[1], [1, 1], [1, 2, 1]...]
def triangle(n):
if n == 0:
return []
elif n == 1:
return [[1]]
else:
new_row = [1]
result = triangle(n-1)
last_row = result[-1]
for i in range(len(last_row)-1):
new_row.append(last_row[i] + last_row[i+1])
new_row += [1]
result.append(new_row)
return result
相反,它返回一个混乱的嵌套列表,其中完全填充了1
这里是讨论中的递归函数,没有第二个附加行的函数(我真的希望有一个全包函数):
要明确的是,我已经完成了指定的任务,这只是为了加深对递归的理解
迭代解决方案:
def triangle(n):
result = []
for row in range(n):
newrow = [1]
for col in range(1, row+1):
newcell = newrow[col-1] * float(row+1-col)/col
newrow.append(int(newcell))
result.append(newrow)
return result
您只需要通过递归传递一个列表列表,然后选取列表的最后一个元素(即三角形的最后一行)来构建新行。像这样:
def triangle(n):
if n == 0:
return []
elif n == 1:
return [[1]]
else:
new_row = [1]
result = triangle(n-1)
last_row = result[-1]
for i in range(len(last_row)-1):
new_row.append(last_row[i] + last_row[i+1])
new_row += [1]
result.append(new_row)
return result
happydave解决方案的替代方案是使用尾部递归:
def triangle(n, lol=None):
if lol is None: lol = [[1]]
if n == 1:
return lol
else:
prev_row = lol[-1]
new_row = [1] + [sum(i) for i in zip(prev_row, prev_row[1:])] + [1]
return triangle(n - 1, lol + [new_row])
是的,正如Karl Knechtel所示,递归Pascal三角形可以这样:
P=lambda h:(lambda x:x+[[x+y for x,y in zip(x[-1]+[0],[0]+x[-1])]])(P(h-1))if h>1 else[[1]]
print(P(10))
它看起来只返回第
n
th个列表。这是有意的吗?您当前的输出是什么?为什么不将列表列表作为参数而不是数字传递?尤其是因为每一行的结果都取决于前一行的结果。你能把你的迭代解包括进来供参考吗?@robert目的是输出一个列表列表,其中每个列表都是三角形的一行。我说到这一点,但是我试图将行收集到一个列表中的任何尝试都会导致任意嵌套的列表包含1。没问题。递归可能令人困惑。我建议使用大量的print语句,或者一个好的调试器。这仍然可以打印出[1,1]?为n=2返回[1,2,1]再添加一个基本情况如何?我认为这会更清楚一些,因为[x+y代表x,y在zip中([0]+prev_row,prev_row+[0])
@KarlKnechtel:我认为你是对的。我喜欢zip(a,a[1:])
技巧:)