• 斐波那契数列 ——各类算法实现(C++实现)


    1. 基本定义

      又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(≥ 3,∈ N*)

    2. 代码实现

    2.1 基本递归代码(不实用

    1 int Fibonacci(int n) {
    2         if( n == 0 )
    3             return 0;
    4         if ( n == 1 )
    5             return 1;
    6         else
    7             return Fibonacci(n - 2) + Fibonacci(n - 1);
    8 }

    解析:以上斐波那契数列是基本的递归方法,但不实用,因为在程序运行时,一旦 n 值过大易造成堆栈溢出状况而且重复严重,举例:n=4,看看程序怎么跑的:

    Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
                        = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
                        = Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
    对于程序而言每一次的递归都是未知的,光是F(1) 便循环了3次之多,故不推荐

    2.2 进阶递归代码(矩阵快速幂)

     1 int Fibonacci(int n) {
     2         if( n == 0 )
     3             return 0;
     4         else if ( n == 1 || n == 2)
     5             return 1;
     6         else if ( n == 3)
     7             return 2;
     8         else
     9             return 3* Fibonacci(n - 3) + 2* Fibonacci(n - 4);
    10 }

    解析:该进阶方法通过斐波那契数列的一个简单规律可以使得冗余程度不再像第一个那般复杂重复,节省空间。矩阵快速幂详解参见:https://www.cnblogs.com/MMMMMMMW/p/12300262.html

    2.3 动态规划版代码

    1 int Fibonacci(int n) {
    2         int f = 0, g = 1;
    3         while(n -- > 0) {
    4             g += f;
    5             f = g - f;
    6         }
    7         return f;
    8 }

    解析:该方法中循环 n 次,因为第 n 个数字是前 n 个数字以规律相加得来,定义的 f 和 g 表示每一次第 n 个数相加时的 n - 1 和 n - 2 位 ,f 在每次运算过后都要 被 g 减去之前的数,方可得到第 n 位的数字。

    图解:

  • 相关阅读:
    iOS之蓝牙开发—CoreBluetooth详解
    iOS-GCD使用详解
    iOS—Mask属性的使用
    idea导入eclipse中的maven项目
    SQL Server 查找字符串中指定字符出现的次数
    lLinux的常用命令
    从excel表中生成批量SQL
    ORA-00911: invalid character 错误解决
    sqlserver sp_who2和inputbuffer的使用,连接数
    如果存在这个表,则删除这个表的sql
  • 原文地址:https://www.cnblogs.com/john1015/p/12909898.html
Copyright © 2020-2023  润新知