方法1:
第n行数字之和为2**(n-1)
n = 6
newline =[1]
print(newline) # 第一行是特例,因为0+0不等于1
for i in range(1,n):
oldline = newline.copy() # 浅拷贝并补0
oldline.append(0) # 尾部补0相当于两端补0
newline.clear() # 使用append,所以要清除
for j in range(i + 1):
newline.append(oldline[j -1]+ oldline[j])
print(newline)
方法2:
两头补零法
除了第一行以外,每一行每一个元素(包括两头的1)都是由上一行的元素相加得到。
目标是打印指定的行,所以算出一行就打印一行,不需要用一个大空间储存所有已经运算出的行。
triangle = []#首先创建一个空列表
n = 6 #假设需要打印前6行
for i in range(n):#循环6次 #0,1,2,3,4,5
cur = [1]
triangle.append(cur) #triangle里放的都是地址
if i == 0 :continue
pre = triangle[i - 1]
for j in range(i - 1):
cur.append(pre[j]+pre[j + 1])#前一行2项之和
cur.append(1)
print(triangle)
方法3:
对称性
使用一次性开辟空间,可以使用列表解析式或者循环迭代的方式。
减少一半的数字计算,左右对称
triangle = [[1], [1, 1]] #所有行
n = 6
for i in range(2, n):
row =[1] * (i+1) # 一次性开辟内存空间,效率更高
triangle.append(row)
for j in range(i//2):
val = triangle[i-1][j] + triangle[i-1][j+1]
row[j +1] = val
if i != 2 * (j+1):
row[-(j+2)] =val
else: #i == 2*(j+1) 中点,n=7出现过3次中点
print(',,,,', val)
print(triangle)
方法4:(最高效)
#单行覆盖
#方法2每次都要清楚列表,浪费时间。
#能够用上方法3的对称性的同时,只开辟一个列表
n = 6
row = [1] * n #一次性开辟足够的空间
for i in range(n):
old = 1 #row[0] #相当于每行行首1,因为i从4开始就有覆盖了,引入变量
for j in range(i//2):
# val = old + row[j+1]
# old = row[j+1]
# row[j+1] = val
row[j+1], old = old +row[j+1],row[j+1]
if i != 2*(j+1): #对等赋值。
row[i-(j+1)] = row[j+1]
print(row[:i+1])
本文介绍了四种不同的算法来生成杨辉三角形的指定行数,包括直接计算每行的和、利用对称性减少计算量、单行覆盖提高效率等技巧。
6433

被折叠的 条评论
为什么被折叠?



