趣学算法——你不知道的“斐波那契数列”

什么是递归?
递归是将复杂问题递推分解为最简问题,然后将结果回归的过程。
比如:去电影院看电影,随便坐到一个座位,问前面的人,这是第几排,前面的人也不知道,再问更前面的人,直到问到第一排,最后把结果传回来。

 

斐波那契是中世纪意大利的数学家,他的突出贡献是把阿拉伯文字带入了欧洲,代替了当时的罗马文字,对欧洲数学的发展起到了很大的推动作用。他在27岁时写了一本《计算之书》,里面提到一个有关兔子的数列。

书中是这样说的,有一对大兔子,每个月能够繁衍出一对小兔子(一公一母),而小兔子经过一个月可以生长为大兔子,现在有一对小兔子,假设兔子们都不死,请问一年后,有多少对兔子?
我们先来通过具体实例推导一下,

                      兔子数量   具体的兔子
第一个月  M1      1          A
第二个月  M2      1          A~ (用“~”代表生长中)
第三个月  M3      2          A->B  (用“->”代表繁衍)
第四个月  M4      3          A->C + B~
第五个月  M5      5          A->D + B->E + C~
第六个月  M6      8          A->F + B->G + C->H + D~ + E~

可以看出,似乎存在着某种规律。

存活的兔子可以分为两类,一类是N-1个月已经存在的兔子,一类是第N个月新繁衍的兔子。
新繁衍的兔子 = 已经生长好的大兔子 =  第N-2个月出生的兔子M(n-2)
由此,得出公式,Mn = M(n-1) + M(n-2)

转化为代码如下

public class FibonacciTest {

    public static void main(String[] args) {
        int result = fib(12);
        System.out.println(result);
    }

    /**
     *  1 总结递归规律
     *  2 确定递归结点
     */
    public static int fib(int n){
        if(n==1||n==2){
            return 1;
        }

        // f(5) ->    f(4)       +    f(3)
        //         f(3) +  f(2)  +  f(2)+f(1)
        //       f(2)+f(1)
        return fib(n-1)+fib(n-2);
    }
}

 

posted @ 2019-10-24 10:01  若愚小姐  阅读(248)  评论(0)    收藏  举报