【问题标题】:Python recursive function for Pascal's Triangle帕斯卡三角形的 Python 递归函数
【发布时间】:2016-05-02 11:22:20
【问题描述】:

我正在尝试执行一个递归函数,该函数生成一个帕斯卡三角形直到第 n 行,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",我不知道为什么。

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

【问题讨论】:

    标签: python recursion pascals-triangle


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,这解决了我的问题。我没有意识到循环也包括其他行。
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 如果我没看错的话,罪魁祸首就是缩进错误。用 0 初始化只是隐藏了问题。
    • 是的,你是对的。但这正是让我真正意识到错误的原因:)
    【解决方案3】:

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

    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

    【讨论】:

      【解决方案4】:

      您收到此错误是因为您没有计算并且没有向函数返回足够的信息。

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

      你会轻松解决这个问题:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        相关资源
        最近更新 更多