Рекурсивная функция Python для треугольника Паскаля

Я пытаюсь сделать рекурсивную функцию, которая генерирует треугольник Паскаля до 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", и я не знаю, почему.

Спасибо за ваше время и помощь в этом маленьком затруднительном моем положении.


person M.Raaj    schedule 02.05.2016    source источник


Ответы (4)


У вас слишком много кода внутри цикла for. Вы заменяете значение l значением temp до того, как закончите заполнять все значения в temp.

Цикл for должен содержать только первый оператор.

person Daniel Martin    schedule 02.05.2016
comment
Большое спасибо, это решило мою проблему. Я не понимал, что цикл включает и другие строки. - person M.Raaj; 02.05.2016

В вашем коде была небольшая ошибка отступа.

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)
person Keiwan    schedule 02.05.2016
comment
Виной тому ошибка отступа, если я правильно читаю. Инициализация с 0 просто скрывает проблему. - person hoyland; 02.05.2016
comment
Да, ты прав в этом. Но именно это позволило мне на самом деле осознать ошибку :) - person Keiwan; 02.05.2016

Вместо того, чтобы исправлять ваш код, я покажу вам оптимизированный подход:

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              

Посмотрите, как работает этот код на ideone.com

person Byte Commander    schedule 02.05.2016

Вы получаете эту ошибку, потому что вы не вычисляете и не возвращаете функции достаточно информации.

попробуйте отладить или следовать вашему коду..

Вы легко оштрафуете проблему :)

person Sadikov    schedule 03.08.2018