Создание цикла , складывающего два соседних числа из предыдущего элемента матрицы
Пишу код , который получает следующий ряд чисел, благодаря некоторым преобразованиям
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')
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