Создание цикла , складывающего два соседних числа из предыдущего элемента матрицы

Пишу код , который получает следующий ряд чисел, благодаря некоторым преобразованиям

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

ряд «1 4 6 4 1» получается из предыдущего ряда «1 3 3 1» так: в начале всегда 1, 1+3=4, 3+3=6, 3+1=4, в конце всегда 1

Идея такова, что уже есть первые два элемента матрицы и цикл начинается с первого элемента и высчитывает там сумму двух соседних элементов и записывает во второй элемент(нумерацию в матрице начинаю с нуля) ,я пытался как то через это реализовать, но не очень то и получается

table = [[1], [1, 1]]
n = int(input())
s = 0
for i in range(n - 2):
  for row in table[i]:
       s += sum(row)
  table.append([s])  
print(table)

что исправить в коде, чтобы заработало?


Ответы (2 шт):

Автор решения: Михаил Муругов
def solve(n: int) -> list:
    retval = [(1,)]  # Начальное состояние
    for _ in range(n - 1):  # Делаем n-1 раз, т.к. первая строка уже задана
        last_row = retval[-1]  # Забираем последнюю строку
        next_row = map(sum, zip(last_row, last_row[1:]))  # Суммируем все пересекающиеся пары из последней строки
        wrapped_next_row = (1, *next_row, 1)  # Добавляем единички с концов
        retval.append(wrapped_next_row)  # Добавляем в итоговое значение очередную строку
    return retval

print(*solve(10), sep='\n')
→ Ссылка
Автор решения: Stanislav Volodarskiy

pascal_triangle - бесконечный генератор строк треугольника Паскаля. Следующая строка получается суммированием соседних элементов предыдущей. Для этого к предыдущей строке прибавим нули слева и справа:

1 3 3 1 ->    0 1 3 3 1
              1 3 3 1 0
            + ---------
              1 4 6 4 1

itertools.islice - инструмент для обрезания бесконечных генераторов:

import itertools

def pascal_triangle():
    line = (1, )
    while True:
        yield line
        line = tuple(map(sum, zip((0, ) + line, line + (0, ))))

for line in itertools.islice(pascal_triangle(), 5):
    print(*line)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
→ Ссылка