斐波拉契数列(Fibonacci)--用生成器生成数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

  

 1 # __Author__Panda-J____
 2 def fib(max):
 3     n,a,b=0,0,1
 4     while n<max:
 5         print(b)
 6         a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1]
 7         n+=1
 8     return 'done'
 9 
10 
11 print(fib(10))

  此时的数列全部生成并存在内存中。

  如果想使用生成器,可以实现使用一个数生成一个,这也是Generator的一个优点:节约内存,可即时响应。(百万量级的时候尤为明显)

  方法为:

print(b)--->yield(b)

  完整程序为:

 1 # __Author__Panda-J____
 2 def fib(max):
 3     n,a,b=0,0,1
 4     while n<max:
 5         yield (b)
 6         a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1]
 7         n+=1
 8     return 'done'
 9 
10 
11 f=fib(10)
12 print(f.__next__())
13 print("-------divided------")
14 print(f.__next__())
15 print(f.__next__())
16 print("==========")
17 for i in range(5):
18     print(f.__next__())
View Code

    结果为:

1
-------divided------
1
2
3
5
==========
8
13
21
34
55

  生成器中只有一个函数就是__next__,跳下一个数。由源代码中可以中途print其他内容可以看出生成器的第二个优点:在数列生成过程中是可以对程序进行暂停和修改的(即并行运算。即协程!!由循环可以看出生成器的第三个特点:__next__函数是一个一个往后推,未使用时会停在上次使用的位置。

如何知道生成器的最大值?

 1 # __Author__Panda-J____
 2 def fib(max):
 3     n,a,b=0,0,1
 4     while n<max:
 5         yield (b)
 6         a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1]
 7         n+=1
 8     return 'done'
 9 
10 
11 f=fib(10)
12 n=0
13 while True:
14     try:
15         n+=1
16         x = next(f)
17         print('f:',x)
18     except StopIteration as e:
19         print('Generator return value:',e.value)
20         print(n)
21         break
View Code

try为测试方法,next函数只能停在当前值,且只有当前值,只能往后走(next)不可能回到过去(previous)

posted @ 2017-08-19 19:55  KeepLearning_!  阅读(842)  评论(0编辑  收藏  举报