使用generator編寫楊輝三角
一、問題描述
“楊輝三角”的定義如下,它有無數多層,故我們無法將所有層都寫出來。這時,使用生成器generator,可以輸出任意多層的值。
註:使用generator時,需要註意:generator保存的是算法,每次調用next()
,就計算出下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration
的錯誤。
二、Python實現
在編程之前,首先找到楊輝三角每層元素之間的規律:
(1)每層首尾兩個位置都是1;
(2)每層第i個元素(不是首尾)的值 = 上一層第i-1個元素的值 + 上一層第i個元素的值。
下面為Python代碼。
把每一行看做一個list,寫一個generator,不斷輸出下一行的list:
# -*- coding: utf-8 -*- def triangles():
def triangles(): #triangles()是一個generator
n=2
lst=[1,]
lst_2=[1,]
while True:
yield lst
lst_2.append(1)
for i in range(1,n-1) :
lst_2[i]=lst[i-1]+lst[i]
n=n+1
return ‘done‘
測試:
n = 0 results = [] for t in triangles(): print(t) results.append(t) n = n + 1 if n == 10: break if results == [ [1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1] ]: print(‘測試通過!‘) else: print(‘測試失敗!‘)
三、代碼改進
進一步觀察“楊輝三角”,發現:
第一行為[1]
第二行為 [1,1]=[1,0]+[0,1]
第三行為[1,2,1]=[1,1,0]+[0,1,1]
第四行為[1,3,3,1]=[1,2,1,0]+[0,1,2,1]
......
是不是已經發現了其中的規律了呢?當當~就是這個啦: 第n行 = [第n-1行,0] + [0,第n-1行]
基於此,我們可以簡化上面的generator代碼:
# -*- coding: utf-8 -*- def triangles():
def triangles(): #triangles()是一個generator
lst=[1,]
while True:
yield lst
lst=list_add([0,*lst],[*lst,0])
return ‘done‘
需要註意的是,Python中的 ‘+’ 表示將兩個list 連接在一起,因此我們需要使用numpy模塊,或者重新定義一個函數list_add(),將兩個list對應元素相加。
這裏,我們使用列表生成式來編寫函數list_add():
def list_add(a,b):
c=[a[i]+b[i] for i in range(len(a))]
return c
使用generator編寫楊輝三角