递归帕斯卡三角形 (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_rlast_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]