在完成使用迭代函数创建pascal三角形的赋值后,我尝试使用递归函数重新创建它。我已经达到了这样的程度,我可以通过它来生成与作为参数传入的数字相对应的单独行。但有几次尝试让它产生整个三角形直到并包括那一行都失败了。我甚至尝试编写一个单独的函数,它迭代输入数字的范围,并使用迭代数字调用递归函数,同时在返回该列表之前将各行附加到列表。所需的输出应该是列表,其中每个内部列表包含三角形的一行。像这样:
[[1], [1, 1], [1, 2, 1]...]
相反,它会返回一个完全填充为1的嵌套列表的乱七八糟的混乱。
这是有问题的递归函数,没有附加行的第二个函数(我真的想要1个全包函数):
def triangle(n):
if n == 0:
return []
elif n == 1:
return [1]
else:
new_row = [1]
last_row = triangle(n-1)
for i in range(len(last_row)-1):
new_row.append(last_row[i] + last_row[i+1])
new_row += [1]
return new_row
要清楚,我已经完成了分配的任务,这只是为了更深入地理解递归......
迭代解决方案:
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
答案 0 :(得分:12)
您只需要通过递归传递列表列表,然后选择列表的最后一个元素(即三角形的最后一行)来构建新行。像这样:
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 :(得分:4)
使用尾递归替换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])
答案 2 :(得分:0)
是的,正如Karl Knechtel所表明的那样,递归的Pascal Triangle也可以这样:
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))