1. 程式人生 > >使用generator編寫楊輝三角

使用generator編寫楊輝三角

spa angle 因此 都是 yield res 之前 楊輝三角 nbsp

一、問題描述

“楊輝三角”的定義如下,它有無數多層,故我們無法將所有層都寫出來。這時,使用生成器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

lst=lst_2.copy()
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編寫楊輝三角