1. 程式人生 > >Python列印楊輝三角

Python列印楊輝三角

最近在看廖雪峰的python教程,學到生成器時用生成器輸出楊輝三角

def triangles():
    L1=[]
    L2=[]
    m=0
    while True:
        if m==0:
            L1.append(1)
        elif m==1:
            L1.append(1)
        else:
            for k in range(len(L1)):
               #print(k)
               if k!=0:
                 L1[k]=L2[k]+L2[k-1]
            L1.append(1)
        L2=L1
        m=m+1
        yield L1
n = 0
for t in triangles():
     print(t)
     n = n + 1
     if n == 10:
        break
    
輸出的結果如下:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 4, 1]
[1, 4, 8, 9, 1]
[1, 5, 13, 22, 23, 1]
[1, 6, 19, 41, 64, 65, 1]
[1, 7, 26, 67, 131, 196, 197, 1]
[1, 8, 34, 101, 232, 428, 625, 626, 1]
[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

一直沒找到原因,後來通過百度發現是列表的引用問題。學習網址

因為在L2=L1進行賦值值時,L2是對L1的引用,這2個list指向了同一片記憶體,所以L1[k]=L2[k]+L2[k-1]

這個語句其實就一直改掉了L2的資料。只要將L2=L1改為L2=L1[:]就可以啦,正確結果如下:

[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]
網上找到的比較簡潔的方式:

def triangles():
    L = [1]    
    while True:
        yield L
        L.append(0);
        L = [L[i-1] + L[i] for i in range(len(L))]