这篇文章讲述的是算法初级部分的兔子产子问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
有一对兔子,从出生后的第三个月起每个月都生一对兔子,小兔子出生的第三个月又生出一对兔子,以此类推,假设所有兔子都不死,问三个月内每个月有多少只兔子。
算法分析
月数 | 小兔子 | 中兔子 | 老兔子 | 兔子总数(单位:对) |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 1 | 1 | 3 | 5 |
6 | 3 | 1 | 4 | 8 |
7 | 4 | 3 | 5 | 13 |
找到规律:从第三个月起,本月兔子总数为前两个月的总数之和(斐波那契数列)
1. f(n) = f(n-1) + f(n-2),n>2
2. 1 ,n<=2
代码实现
public static void main(String[] args) {
for(int n=1 ; n<=30 ; n++){
System.out.printf("%-10d" , fibonacci(n));
if(n%4 == 0)
System.out.println();
}
}
/**
* 求第n个斐波那契数
*/
private static int fibonacci(int n){
if(n<=2)
return 1 ;
else
return fibonacci(n-1) + fibonacci(n-2);
}
样例输出
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040