基本方法:下一行是上一行所有元素两两相加得到,两端再添加上1
n = int(input('>>'))
tiangle=[[1],[1,1]]#预先定义前两行
for i in range(2,n):
per=tiangle[i -1]
cur = [1]#创建新行,首位为1
for j in range(i-1):#循环添加中间值
cur.append(per[j]+per[j+1])
cur.append(1)#末位添加1
tiangle.append(cur)
print(tiangle)#将新生成的行添加到总列表
补零法:在上一行行尾补上0,下一行首尾的1也可以由此计算得来
#末尾补零法0
n=int(input('>>'))
t = [[1]]
for i in range(1,n):
pre = t[i-1]+[0]#生成一个新列表,不会改变原始的里列表
#pre= t[i-1].copy()
#pre.append(0)
cur = []
for j in range(i+1):
#新增行的第一项等于上一行表的末项pre[-1]加上第一项pre[1]
cur.append(pre[j-1]+pre[j])
t.append(cur)
print(t)
末尾补零法在推算新行的首项时使用了负索引
# 两端补零法
====
n=int(input('>>'))
t = [[1]]
for i in range(1,n):
pre =[0]+t[i-1]+[0]
cur = []
for j in range(i+1):
cur.append(pre[j]+pre[j+1])
t.append(cur)
print(t)
对称法 :一次性开辟出空间,先算出前一半的值,然后对称赋值 【python|python 打印杨辉三角】一次性开辟出第n行所需空间然后算值替换,比循环迭代append添加更高效。每次只推算一半,时间复杂度更低
n = int(input('>>'))
triangle = [[1],[1,1]]
for i in range(2,n):
row = [1]*(i+1)#打印第n行先创建出n个元素列表
pre = triangle[i-1]
for j in range(i//2):#推算该行前一半的值
val = pre[j]+pre[j+1]
row[j+1]= val
row[-j-2]=val#对称赋值
triangle.append(row)
print(triangle)
单行覆盖:在上面对称法的基础上降低空间复杂度 一次性开辟好n个长度的空间,每次推算新行时不生成新的列表,在原来的基础上赋值替换。
n = int(input('>>'))
row = [1]*n#一次性开辟空间
for i in range(n):
z =1
for j in range(i//2):
val = z +row[j+1]#计算出来的新值会影响后面的计算,使用临时变量置换一下
z = row[j+1]
row[j+1]=val
row[i-j-1]=val#对称赋值row[j+1]=row[i-j-1]
print(i,end='\t')
print(row[:i+1])#最后在总列表中截取当前计算的行长度打印出来
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)