Объясните работу этого алгоритма pascal - PullRequest
0 голосов
/ 25 января 2020
                  1

                1    1

             1     2     1

          1     3     3     1

       1     4     6     4     1

    1     5     10    10     5    1
def pascal(n):
    if n == 1:
        return [1]
    else:
        line = [1]
        previous_line = pascal(n-1)
        print(previous_line)
        for i in range(len(previous_line)-1):
            line.append(previous_line[i] + previous_line[i+1])
        line += [1]
    return line

print(pascal(4))

previous_line = pascal(n-1) Я не получил эту строку вместе с той, что для l oop pascal(n-1) возвращает целое число, и почему мы можем использовать функцию len над это целое число для л oop

Ответы [ 2 ]

0 голосов
/ 26 января 2020

На всякий случай, если вам нужен более простой ответ:

ROWS = 5

def row( a, b ) :
   return ' ' * (b-a-1) + ' '.join([i for i in str(11**a)])

for i in range(ROWS) :
    print row( i, ROWS )

выводит:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

, и если вы хотите, чтобы это работало в python3, добавьте скобки в print( .. ) звонок.

0 голосов
/ 25 января 2020

pascal(n-1) не возвращает число, оно возвращает список. Например, pascal(4-1) возвращает список [1, 2, 1]. Затем вы используете len, чтобы получить длину этого списка. Учитывая эту длину, вы создаете al oop over i, чтобы найти суммы элементов i и i+1 этого списка. Затем вы добавляете эту сумму к новому списку, который вы создаете.

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

def pascal(n, indent=""):
    line = [1]
    if n > 1:
        previous_line = pascal(n-1, indent+"  ")
        for i in range(len(previous_line)-1):
            line.append(previous_line[i] + previous_line[i+1])
        line += [1]
    print(indent + "".join([f'{i:4}' for i in line]))
    return line

pascal(6)
...