Fibonacci数列<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Fibonacci背景知识
斐波那契:比萨德列奥纳多,又称斐波那契(Leonardo Pisano ,Fibonacci, Leonardo Bigollo,1175年-1250年),意大利数学家,西方第一个研究斐波那契数,并将现代书写数和乘数的位值表示法系统引入欧洲。
Fibonacci 引出
斐波那契在《算盘书》中提出了一个有趣的兔子问题:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔总数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
类推表如下:
               经过月数
0
1
2
3
4
5
6
7
8
9
10
11
12
               幼仔对数
1
0
1
1
2
3
5
8
13
21
34
55
89
               成兔对数
0
1
1
2
3
5
8
13
21
34
55
89
144
               总体对数
1
1
2
3
5
8
13
21
34
55
89
144
233

 

       从一年的总体对数中可以发现,从第二个月开始,其数量是前两个月的数量的和,所以得出递推公式为:
F(n)=F(n-1)+F(n-2)(n>=2)     (1)
Fibonacci数列的性质
1. F(n)=F(n-1)+F(n-2)
2.  其任意一项平方数为其前项和后项的积加一或者减一
    F(n)*F(n)=F(n-1)*F(n+1)+/-1
3.任取相邻的四个斐波那契数,中间两数之积(内积)与两边两数之积(外积)相差1
Fibonacci数列的程序实现
1.  递归实现 
static int Fib1(int n)
                {
                        int []result = new int[]{ 0, 1 };
                        if(n<2) return result[n];
                        return Fib1(n-1)+Fib1(n-2);
                }
2. 非递归实现(迭代法)
static int Fib2(int n)    
                {
                        int[] result = new int[] { 0, 1 };

                        if (n < 2) return result[n];

                        int n1=0,n2=1,retTemp=0;

                        for (int i = 2; i <=n; i++)
                        {
                                retTemp = n1 + n2;
                                n1 = n2;
                                n2 = retTemp;
                        }
                        return retTemp;
                }
2. 创新法(矩阵公式)
存在一个Fibonacii的矩阵恒等式,其形式如下所示:

        对于F(n)来说,只需要求右边的矩阵的n次幂,然后F(n-1)即为所求结果的第一行第一列的值。
       对于右边的矩阵的n次幂可以将n化为:
public static Matrix MatrixPower(int n)
                        {
                                Debug.Assert(n > 0);
                                Matrix matrix = new Matrix();

                                if (n == 1)
                                {
                                        return matrix=new Matrix(1,1,1,0);
                                }
                                if(n%2==0)
                                {
                                        matrix = MatrixPower(n / 2);
                                        matrix = MatrixMuti(matrix, matrix);    
                                }
                                if (n % 2 == 1)
                                {
                                        matrix = MatrixPower((n-1) / 2);
                                        matrix = MatrixMuti(matrix, matrix);
                                        matrix = MatrixMuti(matrix, new Matrix(1, 1, 1, 0));
                                }
                                return matrix;
                        }

  利用Fibonacci矩阵恒等式方法就Fibonacci数列:
internal class MaxtrixBy
                {

                        public struct Matrix
                        {
                                public int m00, m01, m10, m11;
                                public Matrix(int _m00, int _m01, int _m10, int _m11)    
                                {
                                        m00 = _m00;
                                        m01 = _m01;
                                        m10 = _m10;
                                        m11 = _m11;
                                }
                        }
                        public static Matrix MatrixMuti(Matrix m1, Matrix m2)
                        {
                                return new Matrix(m1.m00 * m2.m00 + m1.m10 * m2.m01, m1.m00 * m2.m10 + m1.m10 * m2.m11,
                                                            m1.m10 * m2.m00 + m1.m11 * m2.m01, m1.m10 * m2.m00 + m1.m11 * m2.m11);
                                                            
                        }
    
                        public static Matrix MatrixPower(int n)
                        {
                                Debug.Assert(n > 0);
                                Matrix matrix = new Matrix();

                                if (n == 1)
                                {
                                        return matrix=new Matrix(1,1,1,0);
                                }
                                if(n%2==0)
                                {
                                        matrix = MatrixPower(n / 2);
                                        matrix = MatrixMuti(matrix, matrix);    
                                }
                                if (n % 2 == 1)
                                {
                                        matrix = MatrixPower((n-1) / 2);
                                        matrix = MatrixMuti(matrix, matrix);
                                        matrix = MatrixMuti(matrix, new Matrix(1, 1, 1, 0));
                                }
                                return matrix;
                        }

                        public static int Fib3(int n)
                        {
                                int[] result = new int[] { 0, 1 };
                                if(n<2) return result[n];
                             // MaxtrixBy matrixby=new MaxtrixBy();
                                Matrix m = MaxtrixBy.MatrixPower(n - 1);
                                return m.m00;
                        }
                }
3 运行效率分析

 

递归表示
迭代法
矩阵恒等式
时间复杂度
O(2 exp n)
O(n)
O(logn)

转载于:https://blog.51cto.com/jizhonglee/1151077

Fibonacii数列,兔子问题相关推荐

  1. 斐波那契数列-----兔子繁殖问题

    斐波那契数列-----兔子繁殖问题 斐波那契数列又因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列". 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个 ...

  2. 斐波那契数列---兔子繁殖题

    斐波那契数列-兔子繁殖题 如果说兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来.假设所有兔子都不会死去,能够一直干下去,那么一年以后可决繁殖多少对兔子呢? 斐波那契数列的迭代实现 ...

  3. 递归函数输出斐波那契数列-黄金分割数列-兔子数列(python)

    递归函数输出斐波那契数列-黄金分割数列-兔子数列(python) 斐波那契数列介绍 数学家莱昂纳 多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔 ...

  4. java - 菲波拉契数列 兔子个数

    菲波拉契数列:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 结果演示 代码演示 package com.tw ...

  5. OJ1055: 兔子繁殖问题(C语言计算斐波那契数列/“兔子数列”)

    题目描述 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子.小兔子长到第3个月后每个月又生一对兔子.按此规律,假设没有兔 ...

  6. 斐波那契数列——兔子生兔子问题

    题目 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 兔子的规律为数列1,1,2,3,5,8,13,21 ...

  7. 算法-斐波那契数列(黄金分割数列|兔子数列)

    前言 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列 ...

  8. 斐波那契数列 兔子数列

    斐波那契数列:每一个数都等于前两位数之和 又称兔子数列:有一对兔子从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假设所有兔子不死,问每个月的兔子总数为多少? 下面为循环 ...

  9. 斐波那契数列----兔子问题

    前言 2021年/01/07 我TM可太爱学JAVA了.奥里给!!! 简单搞一搞JAVA,今天的内容主要是方法体,用方法体去就解决一些问题: 1.斐波那契数列,以兔子繁殖为例子而引入,故又称为&quo ...

最新文章

  1. 内存接口芯片,服务器平台,PCIe 芯片
  2. git clone 几种可选参数的使用与区别
  3. mysql hive索引_Hive数据仓库--HiveQL视图和索引
  4. 是什么专业_自考什么专业容易就业
  5. 在mac OSX中安装启动zookeeper
  6. Maven常用的构建命令
  7. 前端学习(2179):vue-router-router的由来和vue-router
  8. 10.深度学习练习:Convolutional Neural Networks: Step by Step(强烈推荐)
  9. 《常用控制电路》学习笔记——数控锁相环调速电路
  10. faster rcnn论文_52 个深度学习目标检测模型汇总,论文、源码一应俱全!(附链接)...
  11. 检测php常量是否存在,php判断变量常量是否存在_PHP教程
  12. Dataset增加行数据及常用方法
  13. 10个空手套白狼案例:不花一分钱为自己赚大钱
  14. [java 手把手教程][第二季]java 后端博客系统文章系统——No7
  15. Unity3D 《拥挤城市》3D房子建筑透视效果实现
  16. Docker mongo:5.0
  17. 军用无人机数据数据集_无人机和大数据
  18. PANDA pipeline的安装与使用-安装(1)
  19. 第六次网页前端培训笔记(JavaScript)
  20. TLM通信(transaction level modle)

热门文章

  1. Charles抓包https(测试app的双向认证)
  2. Kali DNS枚举工具之dnsenum
  3. IE弹出窗口显示URL地址栏
  4. 命令行配合sqlplus管理Oracle
  5. 积木式开发中Session的处理问题
  6. AT2705 Yes or No(组合数学)
  7. python进程、线程的学习心得
  8. js获取当前Frame在父页面中的id
  9. 数据库的ACID特性详解
  10. python学习笔记--easy_install和pip