题目
计算杨辉三角前6行。
杨辉三角的三种方法
求杨辉三角的前6行。
1-1方法
先拼凑两端的1,中间两两相加
triangle=[[1],[1,1]]
for i in range(2,6): # 外层循环,i表示索引
cur=[1] # 拼头部
pre=triangle[i-1] # 上一行
for j in range(len(pre)-1): # 内层循环,两两相加
cur.append(pre[j]+pre[j+1])
cur.append(1) # 拼尾部
triangle.append(cur)
print(triangle)
1-2方法
先拼凑两端的1,中间两两相加
上一行的长度,等于下一行的索引
triangle = []
n = 6
for i in range(n): # 外层循环,i代表索引
cur=[1] # 拼头部
if i==0: # 第一行特例处理
triangle.append(cur)
continue
for j in range(i-1): # i=2才能进来,i-1表示上一行
cur.append(triangle[i-1][j]+triangle[i-1][j+1])
cur.append(1) # 拼尾部
triangle.append(cur)
print(triangle)
2-1方法
新旧行交替方法,旧行尾部补0
利用索引游戏,两两相加,得到头尾的1
n = 6
oldline = [] # 表示旧行
newline = [1] # 表示新行
length = 0
print(newline) # 打印第一行
for i in range(1,n): # 外层循环,i新行索引
oldline = newline.copy() # 新行变旧行
newline.clear() # 新行变成空
oldline.append(0) # 旧行尾部加0
# i是新行的索引
# i-1就是旧行的索引
# 旧行后面加了0,索引旧行最大索引应该是i
# 为了让新行第一个数字为1
# 所以旧行应该是从-1+0开始,一直到i-1 + i
# j的取值应该是从0到i,所以j从range(i+1)取值
for j in range(i+1):
newline.append(oldline[j-1]+oldline[j])
print(newline)
3-1方法
这里面用到两个思想
第一个思想,先打出杨辉三角的形状,格子先打出来,占位
第二个思想,对称赋值,减少循环,提升效率
triangle = []
n = 6
for i in range(n): # i表示每一行的索引
row = [1] # 开始的1
for k in range(i): # 中间填0,尾部填1
row.append(1) if k == i-1 else row.append(0)
triangle.append(row)
if i==0:
continue
for j in range(1,i//2+1): # n=3才能进来
val = triangle[i-1][j-1] + triangle[i-1][j]
row[j] = val # 这是新行的每个元素
# 如果2j!=i,证明是偶数行,要找对称位置赋值
# 如果2j = i,证明是奇数行,这时候j是中点,无对称位置,跳过
if 2j != i:
row[i-j] = val
print(triangle)
3-2方法
与3-1相同,不同的是,用1占位
triangle=[]
n = 6
for i in range(n):
row = [1]*(i+1)
triangle.append(row)
if i == 0:
continue
for j in range(1,i//2+1):
val = triangle[i-1][j-1]+triangle[i-1][j]
row[j]=val
if 2j!=i:
row[i-j]=val
print(triangle)
杨辉三角的解题思想总结:
第一种方法,根据上一行凑下一行,先凑头尾,再凑中间
第二种方法,根据上一行凑下一行,上一行尾部加0,利用索引游戏,头尾中间都凑了
第三种方法,先打印占位形状,利用对称赋值,提升效率