打印前六行
方法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