python杨辉三角的算法_python-1-杨辉三角算法总结

题目

计算杨辉三角前6行。

3sSa75JmyP.jpg

杨辉三角的三种方法

求杨辉三角的前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,利用索引游戏,头尾中间都凑了

第三种方法,先打印占位形状,利用对称赋值,提升效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值