zoukankan      html  css  js  c++  java
  • 斐波拉契数列(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)

  • 相关阅读:
    docker部署mysql
    jira+mysql+破解+中文+compose
    swarm 服务器安装
    docker
    mysql创建用户并手授权
    统计数据库表容量情况
    分区表测试
    实战做项目如何选择开源许可协议(一)-了解协议
    创业公司如何实施敏捷开发
    技术人员如何创业《四》- 打造超强执行力团队
  • 原文地址:https://www.cnblogs.com/BigJ/p/7397729.html
Copyright © 2011-2022 走看看