递归帕斯卡三角形 (Python)
Recursion Pascal's Triangle (Python)
我不确定我的代码在使递归 Pascal 三角形在 python 中工作时做错了什么。非常感谢任何帮助:)
n = 5
def printPascal(n):
Pascal_List = []
if n == 0:
Pascal_List.append([1])
return Pascal_List
if n == 1:
Pascal_List.append([1])
Pascal_List.append([1,1])
return Pascal_List
else:
new_row = [1]
final_r = printPascal(n - 1)
last_row = final_r[-1]
for k in range(1, last_row[-1]):
new_row.append(final_r[k] + final_r[k - 1])
new_row += last_row
final_r.append(new_row)
return final_r
print(printPascal(n))
您在构建新行的循环中造成了一些混淆。 range(1, last_row[-1])
没有任何意义;你想迭代最后一行的索引,即 range(len(last_row))
。您还在下一行混淆了 final_r
和 last_row
。
这是您的代码的更正版本:
n = 5
def printPascal(n):
Pascal_List = []
if n == 0:
Pascal_List.append([1])
return Pascal_List
if n == 1:
Pascal_List.append([1])
Pascal_List.append([1,1])
return Pascal_List
else:
new_row = [1]
final_r = printPascal(n - 1)
last_row = final_r[-1]
for k in range(len(last_row)-1):
new_row.append(last_row[k] + last_row[k + 1])
new_row.append(1)
final_r.append(new_row)
return final_r
print(printPascal(n))
使用帕斯卡三角形的一般公式(n 选择 k)有更好的方法来执行此操作,但我不会深入讨论。
查看您的代码,我猜您正试图将上一行中的前两个数字相加以获得下一个数字。
在您的 else
条件中用这个替换:
#It should be length instead.
for k in range(1, len(last_row)):
new_row.append(last_row[k] + last_row[k - 1])
#You need to add the 1 at the end
new_row.append(1)
已经解释了您的 for
循环的问题,无需重复。但是,请注意,您可以使代码更简单:
- 不需要对
n == 1
案例进行特殊处理
- 您可以通过用零填充最后一行来简化第二部分
试试这个:
def printPascal(n):
if n == 0:
return [[1]]
else:
final_r = printPascal(n - 1)
last = [0] + final_r[-1] + [0] # note: this does not modify final_r
new_row = [last[k] + last[k - 1] for k in range(1, len(last))]
return final_r + [new_row]
我不确定我的代码在使递归 Pascal 三角形在 python 中工作时做错了什么。非常感谢任何帮助:)
n = 5
def printPascal(n):
Pascal_List = []
if n == 0:
Pascal_List.append([1])
return Pascal_List
if n == 1:
Pascal_List.append([1])
Pascal_List.append([1,1])
return Pascal_List
else:
new_row = [1]
final_r = printPascal(n - 1)
last_row = final_r[-1]
for k in range(1, last_row[-1]):
new_row.append(final_r[k] + final_r[k - 1])
new_row += last_row
final_r.append(new_row)
return final_r
print(printPascal(n))
您在构建新行的循环中造成了一些混淆。 range(1, last_row[-1])
没有任何意义;你想迭代最后一行的索引,即 range(len(last_row))
。您还在下一行混淆了 final_r
和 last_row
。
这是您的代码的更正版本:
n = 5
def printPascal(n):
Pascal_List = []
if n == 0:
Pascal_List.append([1])
return Pascal_List
if n == 1:
Pascal_List.append([1])
Pascal_List.append([1,1])
return Pascal_List
else:
new_row = [1]
final_r = printPascal(n - 1)
last_row = final_r[-1]
for k in range(len(last_row)-1):
new_row.append(last_row[k] + last_row[k + 1])
new_row.append(1)
final_r.append(new_row)
return final_r
print(printPascal(n))
使用帕斯卡三角形的一般公式(n 选择 k)有更好的方法来执行此操作,但我不会深入讨论。
查看您的代码,我猜您正试图将上一行中的前两个数字相加以获得下一个数字。
在您的 else
条件中用这个替换:
#It should be length instead.
for k in range(1, len(last_row)):
new_row.append(last_row[k] + last_row[k - 1])
#You need to add the 1 at the end
new_row.append(1)
for
循环的问题,无需重复。但是,请注意,您可以使代码更简单:
- 不需要对
n == 1
案例进行特殊处理 - 您可以通过用零填充最后一行来简化第二部分
试试这个:
def printPascal(n):
if n == 0:
return [[1]]
else:
final_r = printPascal(n - 1)
last = [0] + final_r[-1] + [0] # note: this does not modify final_r
new_row = [last[k] + last[k - 1] for k in range(1, len(last))]
return final_r + [new_row]