杨辉三角python生成器实现

杨辉三角python 生成器实现

记录python学习过程中的问题:
问题描述,在利用python Regenerator 实现杨辉三角的过程中出现一个问题,经过几个小时的思考终于解决了这个问题。记录一下,并希望对以后有帮助:

问题:

杨辉三角定义如下:

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

把每一行看做一个list,试写一个generator,不断输出下一行的list:

##初始代码

def triangles():   
    m = -1
    L = [1]
    while (True):
        yield L       
        m = m + 1
        if m <= 0:
            L.append(L[0])          
        else:
            L1 = [1,1]  
            for i in range(m):
                num = L[i] + L[i+1]
                L1.insert(-1,num)
        L = L1   

n = 0
results = []
for t in triangles():
    
    results.append(t)
    
    n = n + 1
    if n == 10:
        break
    print(results)
#
for t in results:
    print(t)

输出结果:
[1, 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():   
    m = -1
    L = [1]
    #yield L
    while (True):
        yield L       
        m = m + 1
        if m <= 0:
            L1 = [1,1]          
        else:
            L1 = [1,1]  
            for i in range(m):
                num = L[i] + L[i+1]
                L1.insert(-1,num)
        L = L1   
n = 0
results = []
for t in triangles():
    
    results.append(t)
    
    n = n + 1
    if n == 10:
        break
    print(results)
#
for t in results:
    print(t)

```c
输出结果:
[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]

讨论

可以发现两个代码主要的差异在于第一行list的输出,经过反复Debug调试,发现代码问题出在此行代码:

         L.append(L[0])          

调试至此行代码时:
results中的结果会从 [[1]] 变为[[1,1]]。而此时L的结果为[1,1]。因此,初不判断,yield中断输出后,再返回继续执行代码的过程中,L的改变会继续影响上一次中断输出的值。因此这时候就需要避免在下次yield中断输出前对L进行操作(可从改进代码中看出)。

猜你喜欢

转载自blog.csdn.net/Amazing_Fly/article/details/105043423