楊輝三角,是二項式系數在三角形中的一種幾何排列,在中國南宋數學家楊輝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])
