斐波那契数列 订阅
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。 展开全文
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
信息
别    称
黄金分割数列、兔子数列
表达式
F[n]=F[n-1]+F[n-2](n>=3,F[1]=1,F[2]=1)
提出者
莱昂纳多·斐波那契
C语言中
FIB数列
应用学科
数学
中文名
斐波那契数列
适用领域范围
代数
外文名
Fibonacci sequence
提出时间
1202年
斐波那契数列定义
斐波那契数列指的是这样一个数列: 这个数列从第3项开始,每一项都等于前两项之和。斐波那契数列的定义者,是意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点于阿尔及利亚地区,莱昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。另外斐波纳契还在计算机C语言程序题中应用广泛
收起全文
精华内容
下载资源
问答
  • 斐波那契数列的四种实现方式(C语言)

    万次阅读 多人点赞 2020-05-10 21:33:53
    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列, 像这样的:1、1、2、3、5、8、13、21、34、55...... 今天,我们用四种方式来进行实现: 1.递归 int Fibon1(int n){ if...

    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列,

    像这样的:1、1、2、3、5、8、13、21、34、55......

    今天,我们用四种方式来进行实现:

    1.递归

    int Fibon1(int n){
        if (n == 1 || n == 2){
            return 1;
        } else{
            return Fibon1(n - 1) + Fibon1(n - 2);
        }
    }
    int main(){
        int n = 0;
        int ret = 0;
        scanf("%d", &n);
        ret = Fibon1(n);
        printf("ret=%d", ret);
        return 0;
    }


    2.非递归

    int Fibno2(int n){
        int num1 = 1;
        int num2 = 1;
        int tmp = 0;
        int i = 0;
        if (n < 3){
            return 1;
        }else{
            for (i = 0; i <= n-3; i++){
                tmp = num1 + num2;
                num1 = num2;
                num2 = tmp;
            }
            return tmp;
        }
    }


    3.数组

    public  int Fibno3(int n){
        List<int> list = new List<int>();
        list.fib(1);
        list.fib(1);
        int count = list.Count;
         while (count < n){
                    list.fib(list[count - 2] + list[count - 1]);
                     count = list.Count;
              }
             return list[count - 1];
         }
    }


    4.队列

    public int Fibno4(int n){
        Queue<int> queue = new Queue<int>();
        queue.Enqueue(1);
        queue.Enqueue(1);
        for (int i = 0; i <= n - 2; i++){
            queue.Enqueue(queue.AsQueryable().First() + queue.AsQueryable().Last());
            queue.Dequeue();
        }
         return queue.Peek();
    }


    运行结果:

    展开全文
  • 斐波那契数列

    万次阅读 2019-08-24 11:10:29
      斐波那契数列来源于兔子繁殖问题,所以也叫兔子序列。   最开始我一直不能理解兔子问题怎么和斐波那契数列联系在一起的,然后画了这个图之后,就明白了。   第一年有一对小兔子,一年后成年。成年的兔子...

      斐波那契数列来源于兔子繁殖问题,所以也叫兔子序列。
    在这里插入图片描述
      最开始我一直不能理解兔子问题怎么和斐波那契数列联系在一起的,然后画了这个图之后,就明白了。
      第一年有一对小兔子,一年后成年。成年的兔子又可以生出一对小兔子,如此循环往复,每年的兔子数就构成了一个斐波那契数列。
      斐波那契数列有很多马甲:

    • 爬楼梯问题,一次可以爬一级,也可以爬两级;
    • 用1个2 * 1个小矩形覆盖8个2*1的小矩形问题(剑指offer)。

      有四种解决方法:

    1. 递归

      这是最简单,也是效率最差的一种:

        public long recursive(int n) {
            if (n <= 0) return 0;
            if (n == 1) return 1;
            return recursive(n - 1) + recursive(n - 2);
        }
    

       时间复杂度指数级,他的递归通项公式可以转换为一个齐次二阶常系数差分方程:
          设f(n)为参数为n时的时间复杂度,很明显:f(n)=f(n-1)+f(n-2) ,且f(0)=0; f(1)=1;
          特征方程为:x^2-x-1=0
          得 x=(1±√5)/2
          因而f(n)的通解为:
                在这里插入图片描述
          由f(0)=0; f(1)=1可解得c_1,c_2
          最终可得,时间复杂度为:
                在这里插入图片描述
       真是没想到,高数里的差分方程在这里用到了,说真的,我刚看到这里还挺惊喜的。

    2. 数学公式法

       有了上述时间复杂度的分析,就可以直接套用最后得出的公式,直接利用给的n计算x,时间复杂度O(logn)。因为涉及到幂运算。

    3. 动态规划

       利用动态规划的思想,利用递归分析问题,找到状态转移方程,然后从第一个状态开始迭代到最终状态。

    这里的状态转移方程是:f(n) = f(n - 1) + f(n - 2)   (n > 2)
    初始状态:f(0) = 0; f(1) = 1;

        public long addition(int n) {
            int[] result = {1, 2};
            if (n < 2) {
                return result[n];
            }
            long n1 = 0;
            long n2 = 1;
            long n3 = 0;
            for (int i = 2; i <= n; i++) {
                n3 = n1 + n2;
                n1 = n2;
                n2 = n3;
            }
            return n3;
        }
    

    4. 矩阵乘法

    在这里插入图片描述
       根据这个公式写代码算就完事了。

    let matrix22_mul = (x, y) = >{
    	[x[0][0] * y[0][0] + x[0][1] * y[1][0], x[0][0] * y[0][1] + x[0][1] * y[1][1],
    	 x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1]]
    }
    let matrix22_pow = (x, n) =>{
    	var r = [[1,0],[0,1]];
    	var v = x;
    	while (n) {
    		if (n % 2 == 1) {
    			r = matrix22_mul(r, v);
    			n -= 1;
    		}
    		v = matrix22_mul(v, v);
    		n = n / 2;
    	}
    	return r;
    }
    let fibnacci = n => n <= 0 ? 0 : 
    				    matrix22_mul([[0,1],[0,0]], matrix22_pow([[0,1],[1,1]], n - 1))[0][1];
    

       看到winter大神写的代码,待我理解理解后面转为java,再来修改。

    展开全文
  • 斐波那契数列通项公式推导

    万次阅读 2020-12-06 18:18:51
    斐波那契数列通项公式推推导

    一、斐波那契数列

    • 所谓斐波那契数列,是指【当前项】的值等于【前两项】之和的数列:
    ii 0 1 2 3 4 5 6 7 8 9
    T(i)T(i) 1 1 2 3 5 8 13 21 34 55
    • 该数列有递推公式如下:

    T(n)={1(n=0)1(n=1)T(n1)+T(n2)(n>2)T(n) = \begin{cases} 1 & (n = 0) \\ 1 & (n = 1) \\ T(n-1) + T(n-2) & (n > 2) \end{cases}

    二、斐波那契数列通项公式

    1、思路

    • 1)首先将 G(n)=T(n)+xT(n1)G(n) = T(n) + xT(n-1) 作为一个新的数列,求出这个数列的通项公式,很容易知道这个数列一定是一个等比数列,所以一定可以求出如下形式,其中 qq 为常数:
      G(n)G(n1)=T(n)+xT(n1)T(n1)+xT(n2)=q\frac{ G(n) } {G(n-1)}= \frac{T(n) + xT(n-1)} {T(n-1) + xT(n-2)} = q
    • 2)于是,得到:
      G(n)=T(n)+xT(n1)=qn1(T(1)+xT(0))G(n) = T(n) + xT(n-1) = q^{n-1} (T(1) + xT(0))
    • 3)继续构造 H(n)=T(n)+yqnH(n) = T(n) + yq^n,同样有:
      H(n)H(n1)=T(n)+yqnT(n1)+yqn1=Q\frac{ H(n) } {H(n-1)}= \frac{T(n) + yq^n} {T(n-1) + yq^{n-1}} = Q
    • 4)然后求出 xyqQx、y、q,Q 的值,代入即可求得最终公式;

    2、详解

    • 要求这个数列的通项公式,也就是求类似 T(n)=aT(n1)+bT(n2)T(n) = aT(n-1) + bT(n-2) 的通项公式,当 a=b=1a = b = 1 的时候,就是斐波那契数列了。求解的方法有很多,这里介绍一种比较普适的做法;

    • 1)等式两边同时加上 xT(n1)xT(n-1),等式关系不变,如下:
      T(n)+xT(n1)=aT(n1)+xT(n1)+bT(n2)=(a+x)T(n1)+bT(n2)\begin{aligned} T(n) + xT(n-1) &= aT(n-1) + xT(n-1) + bT(n-2) \\ &= (a+x)T(n-1) + bT(n-2) \end{aligned}

    • 2)必然能够找到一个常量 xx, 使得 T(n)+xT(n1)T(n) + xT(n-1) 是一个等比数列,且公比为 a+xa+x
      T(n)+xT(n1)=aT(n1)+xT(n1)+bT(n2)=(a+x)[T(n1)+ba+xT(n2)]\begin{aligned} T(n) + xT(n-1) &= aT(n-1) + xT(n-1) + bT(n-2) \\ &= (a+x) [ T(n-1) + \frac b{a+x} T(n-2) ] \end{aligned}

    • 于是,便有:
      x=ba+xx = \frac b{a+x}

    • 3)化简后得到一元二次方程,如下:
      x2+axb=0x^2 + ax - b = 0

    • 4)一元二次方程求根,得到:
      x1=aa2+4b2          x2=a+a2+4b2x_1 = \frac {-a-\sqrt{a^2+4b} } {2} \ \ \ \ \ \ \ \ \ \ x_2 = \frac {-a+\sqrt{a^2+4b} } {2}

    • 5)令公比 q=a+xq = a+x,则有:
      T(n)+xT(n1)T(n1)+xT(n2)=q\frac{T(n) + xT(n-1)} {T(n-1) + xT(n-2)} = q

    • 6)通过累乘得到:
      T(n)+xT(n1)T(n1)+xT(n2)T(n1)+xT(n2)T(n2)+xT(n3)...T(2)+xT(1)T(1)+xT(0)=qq...qn1\frac{T(n) + xT(n-1)} {T(n-1) + xT(n-2)} * \frac{T(n-1) + xT(n-2)} {T(n-2) + xT(n-3)} *...* \frac{T(2) + xT(1)} {T(1) + xT(0)}= \underbrace{q*q...q}_{\rm n-1}

    • 7)化简后,令 p=T(1)+xT(0)p=T(1) + xT(0),得到:
      T(n)+xT(n1)=qn1(T(1)+xT(0))=qn1p\begin{aligned}T(n) + xT(n-1) &= q^{n-1} (T(1) + xT(0))\\ &= q^{n-1}p\end{aligned}

    • 8)继续参照上述方法,引入一个变量 yy,等式两边同时加上 yqnyq^n,使得 T(n)+yqnT(n) + yq^n 是一个公比为 x-x 的等比数列,如下:
      T(n)+yqn=xT(n1)+qn1p+yqn=x[T(n1)+qn1p+yqnx]\begin{aligned} T(n) + yq^n &= -xT(n-1) + q^{n-1} p + yq^n \\ &= -x[T(n-1) + \frac {q^{n-1} p + yq^n} {-x}] \end{aligned}

    • 9)于是便有:
      yqn1=qn1p+yqnxyq^{n-1} = \frac {q^{n-1} p + yq^n} {-x}

    • 10)等式两边同时除上 qn1q^{n-1},等式不变,如下:
      y=p+yqxy = \frac {p + yq} {-x}
      求得 y=px+q=T(1)+xT(0)2x+a\begin{aligned} y &= - \frac {p}{x+q} \\ &= - \frac {T(1) + xT(0)}{2x+a} \end{aligned}

    • 11)同样通过累乘得到:
      T(n)+yqnT(n1)+yqn1T(n1)+yqn1T(n2)+yqn2...T(1)+yqT(0)+y=(x)(x)...(x)n\frac{T(n) + yq^n} {T(n-1) + yq^{n-1}} * \frac{T(n-1) + yq^{n-1}} {T(n-2) + yq^{n-2}} *...* \frac{T(1) + yq} {T(0) + y}= \underbrace{(-x)*(-x)...(-x)}_{\rm n}

    • 12)最后得到 T(n)T(n) 通项公式如下(其中 xyqx、y、q 均为常量):
      T(n)=(x)n(T(0)+y)yqn=(x)n2x+1x12x+1+x+12x+1(x+1)n=(x+1)n+1xn+12x+1=15[(1+52)n+1(152)n+1]\begin{aligned} T(n) &= (-x)^n * (T(0)+y) - yq^n \\ &= (-x)^n \frac {2x+1-x-1}{2x+1} + \frac{x+1}{2x+1}(x+1)^n \\ &= \frac {(x+1)^{n+1} - x^{n+1}} {2x+1}\\ &= \frac {1}{\sqrt5} [(\frac {1+\sqrt5}{2})^{n+1} - (\frac {1-\sqrt5}{2})^{n+1}] \end{aligned}

    • 所以,斐波那契数列的通项公式如下:

    T(n)=15[(1+52)n+1(152)n+1]T(n) = \frac {1}{\sqrt5} [(\frac {1+\sqrt5}{2})^{n+1} - (\frac {1-\sqrt5}{2})^{n+1}]

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,529
精华内容 10,211
关键字:

斐波那契数列