趣学算法——你不知道的“斐波那契数列”
什么是递归?
递归是将复杂问题递推分解为最简问题,然后将结果回归的过程。
比如:去电影院看电影,随便坐到一个座位,问前面的人,这是第几排,前面的人也不知道,再问更前面的人,直到问到第一排,最后把结果传回来。
斐波那契是中世纪意大利的数学家,他的突出贡献是把阿拉伯文字带入了欧洲,代替了当时的罗马文字,对欧洲数学的发展起到了很大的推动作用。他在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);
}
}

浙公网安备 33010602011771号