Python:打印 1 行帕斯卡三角形

Python: printing 1 row of Pascal Triangle

刚开始学习 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 ]

谢谢,任何 help/advice 将不胜感激

你是对的,最后一个循环是打印三角形的每一行。要打印任何特定的行,jut 运行 具有特定值 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

@riam_98,你想试试这个版本吗:它简化了 logic/flow 以利用 Pascal 关键特性。

可以在此处找到更多阅读材料 - https://en.wikipedia.org/wiki/Pascal's_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

if I wanted to just print 1 row, what would I be changing?

我相信到目前为止给出(和接受)的答案做太多工作来获取单个行的值。如果我们查看@DanielHao 推荐的维基百科页面中的Calculating a row or diagonal by itself,我们可以生成一个更简单的解决方案:

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]
>

which part of the code is printing the triangle structure? I assume the last for loop?

是的,但请注意,由于数字宽度的硬编码,这是一个脆弱的、有限的解决方案:

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

对于较小的值,三角形是不平衡的,对于大于 16 的值,它会失去所有对称性。这是 将其输出与您询问的解决方案进行比较的示例。