python練習--楊輝三角

這裏寫圖片描述

打印前六行

方法1:

triangle = [[1],[1,1]]      #定義前兩列
for i in range(2,6):
    row = [1]
    for j in range(0,i-1):
        vol = triangle[i-1][j] + triangle[i-1][j+1]
        row.append(vol)
    row.append(1)
    triangle.append(row)
print(triangle)

運行結果:

[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

解題思路:

從第[2]行開始,每一個元素(不包括開頭和結尾的1)都是由上一行的兩個元素相加得來的。

ln[i] = l(n-1)[i-1] + l(n-1)[i]
n >= 3

方法1變體:

triangle = []
n = 6
for i in range(n):
    row=[1]
    triangle.append(row)
    if i == 0:
        continue
    for j in range(i-1):
        vol = triangle[i-1][j] + triangle[i-1][j+1]
        row.append(vol)
    row.append(1)
print(triangle)

運行結果:

[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

解題思路:

在原有基礎上,將前兩行加入循環中,通過判斷將特例單獨處理

方法2:補零

n = 6
row = [1]
print(row)

for i in range(1,n):
    newline = row.copy()
    newline.insert(0,0)
    newline.append(0)
    row = []

    for j in range(i+1):
        row.append(newline[j] + newline[j+1])

    print(row)

運行結果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

解題思路:

首先去誒的那個第[0]行特例,從第[1]行開始兩頭加0。
從第[1]行開始,每一個元素都是由上一行的兩個元素相加得來的。
計算一行輸入一行。

方法2變體-左側加0

n = 6
row = [1]
print(row)

for i in range(1,n):
    newline = row.copy()
    newline.append(0)
    row = []

    for j in range(i+1):
        row.append(newline[j-1] + newline[j])

    print(row)

運行結果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

解題思路:

通過負索引來進行相加

方法3-對稱

n = 6
for i in range(n):
    row = [1]*(i+1)
    for j in range(1,i//2+1):
        vol = newline[j] + newline[j-1]
        row[j] = vol
        if i != 2*j:
            row[-j-1] = vol
    newline = row
    print(row)

運行結果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

解題思路:

從運行結果可以看出當一行的元素數爲偶時,每一個元素都有對稱性。
素數時,則最中間的元素沒有。
所以可以通過判斷,噹噹前元素是中間數時,不添加對稱元素。

方法4-覆蓋法

n = 6
row = [1] * n

for i in range(n):
    notuse = n - i
    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-notuse] = val
    print(row[:i+1])

運行結果:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

解題思路:

直接生成一個長度合適的列表,通過切片的方式打印。
從運行結果可以看出,從第[2]行開始,第二個元素覆蓋前一行第二個元素,一次覆蓋,並在最後加1

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章