日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python杨辉三角

發(fā)布時(shí)間:2023/12/20 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python杨辉三角 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

楊輝三角,是二項(xiàng)式系數(shù)在三角形中的一種幾何排列,在中國(guó)南宋數(shù)學(xué)家楊輝1261年所著的《詳解九章算法》一書(shū)中出現(xiàn)。在歐洲,帕斯卡(1623----1662)在1654年發(fā)現(xiàn)這一規(guī)律,所以這個(gè)表又叫做帕斯卡三角形。帕斯卡的發(fā)現(xiàn)比楊輝要遲393年,比賈憲遲600年

第一種解決方法:

1.一次性開(kāi)辟每行的內(nèi)存空間

2.利用對(duì)稱(chēng)性解決

triangle = [] n = 6 for i in range(n):#row 定義了left的1 ,索引第二層循環(huán)的范圍就是i,第0行0個(gè)值,第一行1個(gè)值,第二行2個(gè)值row = [1]#此層循環(huán)每層的個(gè)數(shù),拋除已經(jīng)定好的1,當(dāng)2行i=1,k=0.實(shí)際一個(gè)空位#k=i-1的時(shí)候填充1,不等的時(shí)候填充0for k in range(i):if k == i-1:row.append(1)else:row.append(0)#每行都是1 然后append到triangle,因?yàn)榱斜碚{(diào)用列表,所以更改row就好了(淺copy) triangle.append(row)#特殊情況,當(dāng)i=0的時(shí)候 跳過(guò)本次循環(huán),進(jìn)行下一次循環(huán)i = 1if i == 0:continue#找對(duì)稱(chēng),前2行特殊情況,i=0 or i=1 帶入此循環(huán)不執(zhí)行,第三行的時(shí)候就對(duì)稱(chēng)只有一個(gè),第四行的時(shí)候 #對(duì)稱(chēng)還是一個(gè),第五行的時(shí)候?qū)ΨQ(chēng)是2個(gè),對(duì)稱(chēng)的時(shí)候劃一條豎線(xiàn)分析,排除左右2邊的1for j in range(i//2): #第三層通過(guò)第2層的2個(gè)數(shù)相加,然后更改對(duì)應(yīng)的值,value = triangle[i-1][j]+triangle[i-1][j+1]row[j+1] = value #利用負(fù)索引找到對(duì)應(yīng)的位置把value的值賦值row[-j-2]=value print(triangle) triangle = [] n = 6 for i in range(n):row = [1]*(i+1)triangle.append(row)for j in range(i//2):vaule = triangle[i-1][j]+triangle[i-1][j+1]row[j+1]=vaulerow[-j-2]=vaule print(triangle)

?

?

第二種方法:

1.下一行依賴(lài)上一行所有元素,是上一行所有元素的兩兩相加的和,再在兩頭各加1。?

#把前2行特殊情況單獨(dú)拿出,用列表嵌套來(lái)表示 triangle = [[1],[1,1]] #從第三行開(kāi)始循環(huán) for i in range(2,6): #定義新列表放每行的數(shù)字元素newline = [] #每行先從空列表append 一個(gè)1 [1]newline.append(1) #在每行列表中增加對(duì)應(yīng)的數(shù)字,i行應(yīng)該有i個(gè)數(shù)字,但是已經(jīng)定義好了左側(cè)第一個(gè)元素為1 ,所以range(i)for j in range(i-1): #i行的j元素等于(i-1)行的值相加value = triangle[i-1][j]+triangle[i-1][j+1]newline.append(value) #填充右側(cè)的1newline.append(1)triangle.append(newline) print(triangle)

?

triangle = [] n = 6 for i in range(n):newline = [1]triangle.append(newline)if i == 0:continuefor j in range(i-1):val = triangle[i-1][j]+triangle[i-1][j+1]newline.append(val)#利用到了深淺拷貝的知識(shí),復(fù)雜列表,調(diào)用的引用地址,更改了newline列表 索引triangle列表也隨之更改newline.append(1) print(triangle)

?第三種方法

1.除了第一行以外,每一行每一個(gè)元素(包括兩頭的1)都是由上一行的元素相加得到。如何得到兩頭的1呢? 目標(biāo)是打印指定的行,所以算出一行就打印一行,不需要用一個(gè)大空間存儲(chǔ)所有已經(jīng)算出的行

triange = [1] print(triange) #triange.insert(0,0) triange.append(0) n = 6 for i in range(1,n):newline = []for j in range(i+1):value = triange[j]+triange[-j-1]newline.append(value)print(newline)triange=newline # triange.insert(0,0)triange.append(0)

?第四種方式:單行覆蓋

1.每次都要在循環(huán)里清除列表有點(diǎn)浪費(fèi)時(shí)間,值開(kāi)辟一個(gè)列表,利用對(duì)稱(chēng)和覆蓋
2.明確最大行的元素個(gè)數(shù),前6行最大的元素個(gè)數(shù)是6個(gè),下一行等于首元素不變覆蓋中間元素

#row = [1,1,1,1,1,1] # n = 6 # [:1] i==0 offset==6 j=range(1,1) jump # [:2] i==1 offset==5 j=range(1,1) jump # # [:3] i==2 offset==4 j=range(1,2) # [:4] i==3 offset==3 j=range(1,2) # [:5] i==4 offset==2 j=range(1,3) # [:6] i==5 offset==1 j=range(1,3) n = 6 row = [1]*n for i in range(n): #4行和6行對(duì)稱(chēng)的負(fù)所以是-2;-2,-3;定義的偏移量offset和j做運(yùn)算方便找到符所以的位置offset = n-i #所以為1的位置都是1+x,所以z=1是定義第一個(gè)1,定義在for循環(huán)外,規(guī)避覆蓋影響 #此處不用z=1來(lái)設(shè)置臨時(shí)變量,val=row[0]+row[j]的話(huà) 在算到索引位2的時(shí)候就錯(cuò)了,因?yàn)閞ow[0]是固定值z = 1for j in range(1,i//2+1):val = z+row[j]row[j],z = val ,row[j]if i !=2*j:row[-j-offset] = valprint(row[:i+1])

?

轉(zhuǎn)載于:https://www.cnblogs.com/harden13/p/8659895.html

總結(jié)

以上是生活随笔為你收集整理的Python杨辉三角的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。