个人认为,学习递归,永远绕不开斐波那契数列,不管什么语言,都能见到这个题目。关于斐波那契数列,我们很久不学习数学,可能不是很清楚,但是和你说这个不死神兔,每个月生一对兔子,你就知道这个题目了。
1.兔子生兔子的经典问题
首先,斐波那契是西元1202年,意大利一个青年叫斐波那契,在他一本著作提到一个有趣的问题:假设一对刚出生的小兔一个月之后就能长成大兔,再过一个月就生下一对小兔,并且以后每个月都生一对小兔,一年内没有发生死亡。问题:一对刚出生兔子,一年内繁殖出多少对兔子?
2.分析
这种问题,最容易做的就是先计算出前面三到五个月的数据,形成一个数列,然后大胆推测,找出数列公式,公式拿到了,答案也就出来。下面我们分析一下和最终分析过程:
数列: 1 1 2 3 5 8 13
第一个月,一对小兔子 1对兔子
第二个月,一对大兔子 1对兔子
第三个月,一对大兔子生了一对小兔子 2对兔子
第四个月,一对大兔子生了一对小兔子
一对小兔子长成大兔子 3对兔子
第五个月,两对大兔子生了两对小兔子
一对小兔子长成大兔子 5对兔子
公式分析:发现第三个是等于前面两个的和,即f(n+1) = f(n) + f(n-1),(n>=2)
3.递归代码实现
package io;
public class Test9 {
public static void main(String[] args) {
System.out.println(fun(7));
}
/**
* 用递归求斐波那契数列
*/
public static int fun(int num) {
if( num == 1 || num == 2) {
return 1;
}else {
return fun(num - 2) + fun(num - 1);
}
}
}
打印出13,当n等于7,也就是第七个月有13对兔子,那么一年12个月就也计算出来。如果,这里不使用递归思想,也可以用数组解决。
package io;
public class Test9 {
public static void main(String[] args) {
//用数组对象做斐波那契数列
int[] arr = new int[7]; //暂时计算第七个月
arr[0] = 1;
arr[1] = 1;
//遍历数组对其他元素赋值,从第三个月开始,所以i索引是2
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 2] + arr[i - 1];
}
System.out.println(arr[arr.length - 1]);
}
}
直接运行结果也是13,所以,要计算一年,就把7改成12就可以。