Python: печать 1 строки треугольника Паскаля

Новичок в изучении Python, и у меня возникли проблемы с пониманием предоставленного решения? Это связано с треугольником Паскаля и печатью строк, когда пользователь просит ввести номер строки.

Были предоставлены кусочки решения, а остальное я вписал (сначала в цикл for)..

n=int(input("Enter a row number: "))
a=[]
for i in range(n):
    a.append([])
    a[i].append(1)
    for j in range(1,i):
        a[i].append(a[i-1][j-1]+a[i-1][j])
    if(n!=0):
        a[i].append(1)
for i in range(n):
    print("   "*(n-i),end=" ",sep=" ")
    for j in range(0,i+1):
        print('{:4}'.format(a[i][j]),end=" ")
    print()

Мой вопрос в том, какая часть кода печатает структуру треугольника? Я предполагаю, что последний цикл for? Также, если бы я хотел просто напечатать 1 строку, что бы я изменил? ПРИМЕР: Ввод: 5, а вывод будет [1 4 6 4 1]

Спасибо и буду признателен за любую помощь/совет


person riam_98    schedule 28.01.2021    source источник
comment
Пожалуйста, назначьте фиксированное значение для n, например. n=5, в идеале сделать то же самое для a. Также, пожалуйста, предоставьте вывод вашего кода.   -  person peer    schedule 28.01.2021


Ответы (3)


Вы правы, последний цикл печатает каждую строку треугольника. Чтобы напечатать любую конкретную строку, просто запустите второй цикл с определенным значением i.

До этого есть более простой способ продвинуться дальше. Давайте рассмотрим вывод кода ниже:

n = 7
a = []
for i in range(n):
    a.append([])
    a[i].append(1)
    for j in range(1, i):
        a[i].append(a[i - 1][j - 1] + a[i - 1][j])
    if (n != 0):
        a[i].append(1)

print(a)

Результат:

[[1, 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]]

Из этого двухмерного массива вы можете решить, какой отдельный элемент вы хотите напечатать. Например, в индексе 4 у вас есть [1, 4, 6, 4, 1]. Из этих значений в массиве a можно определить, какую строку печатать.

Теперь для 5, если вы хотите [1, 4, 6, 4, 1], вы можете просто сделать следующее:

n = 7
a = []
for i in range(n):
    a.append([])
    a[i].append(1)
    for j in range(1, i):
        a[i].append(a[i - 1][j - 1] + a[i - 1][j])
    if (n != 0):
        a[i].append(1)

to_print = 5
for i in range(0, len(a[to_print-1])):
    print(a[to_print-1][i], end=" ")

Вывод будет:

1 4 6 4 1
person Jalaj Varshney    schedule 28.01.2021
comment
Не могли бы вы объяснить, что происходит в цикле for после to_print? Просто чтобы убедиться. Я понимаю, что to_print равно 5, поэтому в цикле for мы смотрим на диапазон от 0 до последней строки, которую я хочу. а затем печатает последнюю строку с пробелом между ними? - person riam_98; 29.01.2021
comment
a — это двумерный массив, в котором каждый элемент представляет строку в треугольнике Паскаля. Теперь вам нужна строка с индексом 4. Мы переходим от 0 к размеру массива с индексом 4. По индексу 4 массив равен: 1, 4, 6, 4, 1. Таким образом, мы выполняем цикл от 0 до 4, как размер этого массива равен 5. Мы печатаем каждый элемент. - person Jalaj Varshney; 29.01.2021

@ riam_98, не могли бы вы попробовать эту версию: она упрощает логику/процесс, чтобы использовать преимущества Pascal ключевых характеристик.

Дополнительную информацию можно найти здесь - https://en.wikipedia.org/wiki/Pascal%27s_triangle

from typing import List


def getRow(index: int) -> List[int]:

    row = [1]       # firsts row

    if index == 1:  return row

    for i in range(index-1):
        for j in range(i, 0, -1):
            row[j] = row[j] + row[j-1]
        row.append(1)
    return row


print(getRow(2))
print(getRow(3))
print(getRow(4))
print(getRow(5))

Выходы:

[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]   # 5th
person Daniel Hao    schedule 28.01.2021

если бы я хотел просто напечатать 1 строку, что бы я изменил?

Я считаю, что ответы, данные (и принятые) до сих пор, делают слишком много работы для получения значений для отдельной строки. Если мы посмотрим на Вычисление строки или диагонали отдельно на странице Википедии, которую рекомендует @DanielHao, мы можем сгенерировать более простое решение:

n = int(input("Enter a row number: "))

numbers = [1]

for k in range(1, n):
    numbers.append(numbers[-1] * (n - k) // k)

print(numbers)

Нам не нужно генерировать полный треугольник до нужной нам строки или использовать вложенные циклы для его вычисления.

ВЫВОД

> python3 test.py
Enter a row number: 5
[1, 4, 6, 4, 1]
> python3 test.py
Enter a row number: 10
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
>

какая часть кода печатает треугольную структуру? Я предполагаю, что последний цикл for?

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

print('{:4}'.format(a[i][j]),end=" ")

При меньших значениях треугольник становится односторонним, а при значениях больше 16 он теряет всю свою симметрию. Вот пример треугольного вывода Pascal, который самонастраивается. Сравните его вывод с решением, о котором вы спрашиваете.

person cdlane    schedule 09.02.2021