[Python] 楊輝三角 (生成器generator & 列表生成式)

練習

楊輝三角定義如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一個list,試寫一個generator,不斷輸出下一行的list:

期待輸出:
# [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]

思路:找規律

第一行:[1]

第二行:[0, 1] + [1, 0] = [1, 1]

第三行:[0, 1, 1] + [1, 1, 0] = [1, 2, 1]

第四行:[0, 1, 2, 1] + [1, 2, 1, 0] = [1, 3, 3, 1]

第五行:[0, 1, 3, 3, 1] + [1, 3, 3, 1, 0] = [1, 4, 6, 4, 1]

…… ……

可以看出,每一行的List都是由上一行的List分別在頭、尾加上一個0之後新生成的兩個List對應位置元素之和,求兩個List對應位置元素之和可以利用zip()函數

即:L=[ sum[ i ] for i in zip( [0]+L, L+[0] ) ]

 

例:
>>> list(zip([0,1,1],[1,1,0]))                                                  
[(0, 1), (1, 1), (1, 0)]      

>>> L=[sum(i)  for i in list(zip([0,1,1],[1,1,0]))]  
>>> L   
[1, 2, 1] 

 代碼:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math

def triangles():

    L = [1]

    while True:

        yield L

        zipped=list(zip([0]+L, L+[0]))
        L = [sum(i) for i in zip([0]+L, L+[0])]

# 期待輸出:
# [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]
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('測試失敗!')

 

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