Pascal三角形的Python递归函数

时间:2016-05-02 11:22:21

标签: python recursion pascals-triangle

我尝试做一个递归函数,直到第n行生成一个pascal的三角形,n是用户输入。到目前为止,这是我的代码:

def printPascal(l,n):
    while n != 1:
        temp = [None]*(len(l)+1)
        temp[0] = 1
        temp[len(l)] = 1
        for i in range(1,len(temp)-1):
            temp[i] = l[i] + l[i-1]
            l = temp
            print(temp)
        n = n-1
        printPascal(l,n)


n = int(input("Enter a value for n:"))
l = [1,1]
printPascal(l,n)

这就是它给我的错误:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\test.py", line 16, in <module>
    printPascal(l,n)
  File "C:\Users\User\Desktop\test.py", line 11, in printPascal
    printPascal(l,n)
  File "C:\Users\User\Desktop\test.py", line 7, in printPascal
    temp[i] = l[i] + l[i-1]
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

事情是我有点理解这个问题,并试图追踪它无济于事。我知道在temp[i] = l[i] + l[i-1]代码中以l[i]l[i -1]"None"并且我不知道原因。

感谢您在我这个小困境中的时间和帮助。

4 个答案:

答案 0 :(得分:1)

您的代码中有一点缩进错误。

def printPascal(l,n):
    while n != 1:
        temp = [0]*(len(l)+1)
        temp[0] = 1
        temp[len(l)] = 1
        for i in range(1,len(temp)-1):
            temp[i] = l[i] + l[i-1]
        l = temp
        print(temp)
        n = n-1
        printPascal(l,n)

答案 1 :(得分:1)

你在“for”循环中有太多的代码。在填写l中的所有值之前,您将temp的值替换为temp的值。

for循环应该只包含第一个语句。

答案 2 :(得分:1)

我会向您展示一种优化的方法,而不是修复您的代码:

def pascal_triangle(n, triangle=[[1]]):
    if n > len(triangle):
        last_row = triangle[-1]
        next_row = [a+b for (a, b) in zip([0] + last_row, last_row + [0])]
        return pascal_triangle(n, triangle + [next_row])
    return triangle

如何运行它:

n = int(input("Pascal's triangle size: "))
print(*pascal_triangle(n), sep="\n")

输入9的输出示例:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

或使用更漂​​亮的打印命令:

print(*[" ".join(map(str, line)).center(40) for line in pascal_triangle(9)], sep="\n")

看起来像这样:

                    1                         
                   1 1                        
                  1 2 1                       
                 1 3 3 1                      
                1 4 6 4 1                     
              1 5 10 10 5 1                   
             1 6 15 20 15 6 1                 
           1 7 21 35 35 21 7 1                
          1 8 28 56 70 56 28 8 1              

See this code running on ideone.com

答案 3 :(得分:0)

出现此错误是因为您没有计算并且没有将足够的信息返回给函数。

尝试调试或遵循您的代码。

您将轻松解决该问题:)