问题描述
刚开始学习 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 示例,将其输出与您所询问的解决方案进行比较。