C++初学之 2.递归算法典型案例: 斐波那契(Fibonacci)兔子问题(第三项为前两项的累加问题)
著名的意大利数学家斐波那契(Fibonacci)在他的著作《算盘书》中提出了一个“兔子问题”:假定小兔子一个月就可以长成大兔子,而大兔子每个月都会生出一对小兔子。(即兔子从生后第三个月才会生小兔子。)如果年初养了一对小兔子,问到年底时将有多少对兔子? (当然得假设兔子没有死亡而且严格按照上述规律长大与繁殖)。
1、分析问题。
我们可以根据题意列出表1来解决这个问题:
表1兔子问题分析表
|
1月 |
2月 |
3月 |
4月 |
5月 |
6月 |
7月 |
8月 |
9月 |
10月 |
11月 |
12月 |
小兔 |
1 |
|
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
大兔 |
|
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
89 |
合计 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
89 |
144 |
这个表格虽然解决了斐波那契的兔子问题(年底时兔子的总数是144只),但仔细观察一下这个表格,你会发现兔子的数目增长得越来越快,如果时间再长,只用列表的方法就会有困难。(例如,你愿意用列表的方法求出5年后兔子的数目吗?)我们需要研究表中的规律,找出一般的方法,去解决这个问题。
1 #include <iostream>
2 using namespace std;
3 int fib(int n){
4 if(n==1||n==0)return 1;
5 else return (fib(n-1)+fib(n-2));
6 }
7 int main(){
8 cout<<"请输入月数为:"<<endl;
9 int n;
10 cin>>n;
11 cout<<"兔子总数为:"<<fib(n)<<endl;
12 return main();
13 }