Python 杨辉三角 生成器

# -*- coding: utf-8 -*-
# 杨辉三角
"""
列表生成式直接占用空间,generator一边循环一边计算的机制,存储一个算法,可以通过for循环迭代调用generator
不能使用列表生成式可以通过函数实现,含有yield关键字则为生成器
普通函数返回一个结果,按照顺序执行
生成器函数返回的是一个生成器对象,每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
不停调用next非常繁琐并且没有更多元素时会报错,一次只返回一个对象,生成器正确用法是使用for循环迭代调用返回
"""
def triangels():
   ret = [1]
   while True:
      yield ret
      ret = [sum(i) for i in zip([0] + ret, ret + [0])]  
   #  ret = [x + y for (x, y) in zip([0] + ret,  ret + [0])]
   #  ret = [1] + [x+y for x,y in zip(ret[:-1],ret[1:])] + [1]
"""
上面的公式一开始不太理解,后面转化为下面的公式后比较一目了然,
zip([0]+ret,ret+[0)]=zip([0]+[1],[1]+[0])=zip[(0,1),(1,0)]
sum(i) 将两个列表相同位置的元素相加得到新的列表最后变成[1,1]
我们可以再看下当ret = [1,1]之后公式是怎么计算的,zip([0]+[1,1],[1,1]+[0])=zip[(0,1,1)+(1,1,0)]
sum(i) 或者x + y=[1,2,1]以此类推
"""
n = 0
results = []
for t in triangels():
   print('T = ', t)
   results.append(t)
   print('Results = ', results)
   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('测试失败!')

猜你喜欢

转载自blog.csdn.net/u013274257/article/details/84316716