zoukankan      html  css  js  c++  java
  • Python算法_三种斐波那契数列算法

    斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=0,F(2)=1, F(n)=F(n - 1)+F(n - 2)(≥ 3,∈ N*

    本文章要解决的问题是:

    1、生成前n项斐波那契数列
    2、求第n项斐波那契数列的值是多少
    3、给定终止值,生成此前斐波那契数列
     

    1、求第n项斐波那契数列的值是多少(普通版)

    根据通项公式递归求值,此种方法虽代码简洁却效率太低

    1 def Fibonacci(n):
    2     if n == 1:  # 如果n=1,返回0
    3         return 0
    4     elif n == 2:  # 如果n=2,返回1
    5         return 1
    6     else:
    7         return Fibonacci(n-1) + Fibonacci(n-2)  # 通项公式 F(N) = F(N-1) + F(N-2)

    2、求第n项斐波那契数列的值是多少(快速版)

    由于递归自顶向下的方式效率太低,我们采用自底向上的方式,先将数值正向放入列表中,最后从列表中取值。

     1 def Fibonaccii(n):
     2     seq = [0,1]  # 初始列表怕[0,1]
     3     if n == 1:  # 如果n=1,返回[0]
     4         return [0]
     5     elif n == 2:  # 如果n=2,返回[0,1]
     6         return [0,1]
     7     else:
     8         for i in range(n-2):  # 循环往列表中添加数列,初始已有两项故添加项数为n-2
     9             seq.append(seq[i]+seq[i+1])  # 添加的数列值等于前两项的和
    10         return seq[-1]  # 取最后一项的值

    3、给定终止值,生成此前斐波那契数列

    随便给定一个数字,求不大于此数值的斐波那契数列

    def Fibonacciii(n):
        seq = [0,1]  # 初始化列表
        i = 0  # 初始i
        if n == 0:  # 如果n=0,返回列表[0]
            return [0]
        else:
            if n <= 3:  # 如果0<n<3
                for i in range(n):  # 循环往初始列表中添加斐波那契数列
                    seq.append(seq[i]+seq[i+1])
                return seq
            else:  # 如果n > 3
                while True:  # 理论上当n 不确定时,需要添加的项数也是不确定的,故死循环
                    if seq[-1] <= n:  # 一直添加,如果添加的最后一项不大于给定值
                        seq.append(seq[i]+seq[i+1])
                        i += 1  # 每次循环i 递增
                        continue  # 继续循环,不执行以下代码
                    break  # 当最后一项大于给定值时,跳出死循环
                return seq[0:-1]  # 最后返回去掉最后一个数值的斐波那契数列

    4、求前n项斐波那契数列

     1 def Fibonaccii(n):
     2     seq = [0,1]  # 初始化列表
     3     if n == 1:  # n=1,返回[0] 
     4         return [0]
     5     elif n == 2:  # n=2,返回[0,1]
     6         return [0,1]
     7     else:
     8         for i in range(n-2): # n>2,循环添加数列到初始列表中
     9             seq.append(seq[i]+seq[i+1])
    10         return seq 
  • 相关阅读:
    vim delete
    npm ERR! network connect ETIMEDOUT
    在 ubuntu 14.04 Unity 中清除和关闭 Totem 播放记录
    ubuntu 14.04 上 jvpn 使用说明
    LWP::Protocol::https not installed
    perl 安装模块
    触摸屏工作方式
    如何检测死锁并快速定位死锁位置
    如何用 yum 的一个包替换另一个包
    shell 中 here documemt << 与 <<- 的区别
  • 原文地址:https://www.cnblogs.com/waterr/p/13195852.html
Copyright © 2011-2022 走看看