Python楊輝三角


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

第一種解決方法:

1.一次性開辟每行的內存空間

2.利用對稱性解決

triangle = []
n = 6
for i in range(n):
    #row 定義了left的1 ,索引第二層循環的范圍就是i,第0行0個值,第一行1個值,第二行2個值
    row = [1]
    #此層循環每層的個數,拋除已經定好的1,當2行i=1,k=0.實際一個空位
    #k=i-1的時候填充1,不等的時候填充0
    for k in range(i):
        if k == i-1:
            row.append(1)
        else:
            row.append(0)
    #每行都是1 然后append到triangle,因為列表調用列表,所以更改row就好了(淺copy)
    triangle.append(row)
    #特殊情況,當i=0的時候 跳過本次循環,進行下一次循環i = 1
    if i == 0:
        continue
    #找對稱,前2行特殊情況,i=0 or i=1 帶入此循環不執行,第三行的時候就對稱只有一個,第四行的時候
#對稱還是一個,第五行的時候對稱是2個,對稱的時候划一條豎線分析,排除左右2邊的1
    for j in range(i//2):
#第三層通過第2層的2個數相加,然后更改對應的值,
        value = triangle[i-1][j]+triangle[i-1][j+1]
        row[j+1] = value
#利用負索引找到對應的位置把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]=vaule
        row[-j-2]=vaule
print(triangle)

 

 

第二種方法:

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

#把前2行特殊情況單獨拿出,用列表嵌套來表示
triangle = [[1],[1,1]]
#從第三行開始循環
for i in range(2,6):
#定義新列表放每行的數字元素
    newline = []
#每行先從空列表append 一個1 [1]
    newline.append(1)
#在每行列表中增加對應的數字,i行應該有i個數字,但是已經定義好了左側第一個元素為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)
#填充右側的1
    newline.append(1)
    triangle.append(newline)
print(triangle)

 

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

 第三種方法

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

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.每次都要在循環里清除列表有點浪費時間,值開辟一個列表,利用對稱和覆蓋
2.明確最大行的元素個數,前6行最大的元素個數是6個,下一行等於首元素不變覆蓋中間元素

#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行對稱的負所以是-2;-2,-3;定義的偏移量offset和j做運算方便找到符所以的位置
    offset = n-i
#所以為1的位置都是1+x,所以z=1是定義第一個1,定義在for循環外,規避覆蓋影響
#此處不用z=1來設置臨時變量,val=row[0]+row[j]的話 在算到索引位2的時候就錯了,因為row[0]是固定值
    z = 1
    for j in range(1,i//2+1):
        val = z+row[j]
        row[j],z = val ,row[j]
        if i !=2*j:
            row[-j-offset] = val
    print(row[:i+1])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM