Python:打印 1 行 Pascal Triangle

问题描述

刚开始学习 Python 并且在理解所提供的解决方案时遇到了一些麻烦? 它与 Pascal Triangle 和在要求用户“输入行号”时打印行有关

提供了一些解决方案,其余的我都适合(第一个 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 ]

谢谢,任何帮助/建议将不胜感激

解决方法

你是对的,最后一个循环是打印三角形的每一行。要打印任何特定行,只需使用特定值 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,2,3,4,6,5,10,15,20,1]]

从这个二维数组中,您可以决定要打印的单个元素。例如,在索引 4 处,您有 [1,1]。根据数组 a 中的这些值,您可以确定要打印哪一行。

现在对于 5,如果您想要 [1,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,您想试试这个版本吗:它简化了逻辑/流程以利用 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,-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,1]   # 5th
,

如果我只想打印 1 行,我会改变什么?

我相信到目前为止给出(和接受)的答案做了太多工作来获取单个行的值。如果我们查看@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,1]
> python3 test.py
Enter a row number: 10
[1,9,36,84,126,1]
>

代码的哪一部分打印了三角形结构?我假设 最后一个 for 循环?

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

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

对于较小的值,三角形是不平衡的,对于大于 16 的值,它会失去所有对称性。下面是一个 Pascal's triangle output that self adjusts 示例,将其输出与您所询问的解决方案进行比较。