兔子繁殖问题
问题描述
著名意大利数学家Fibonacci曾提出这样一个问题,说是:有一对兔子,从出生后第3个月起每月都生一对小兔子,小兔子长到第3个月后每个月又生一对小兔子,按此规律,假设兔子没有去世亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?

问题剖析
对付这类问题,如果仅凭脑筋思考,想不明白的话,可以通过仿照兔子生小兔子列式子的办法来做,找出个中的规律
(编程便是通过找题目中的规律,然后抽象,使得可以用通用办法来表达,再将这种通用办法写成某种措辞的形式)
第1个月:1
第2个月:1
第3个月:1+1=2(第1个数1表示原来的兔子,第2个数1表示生的小兔子)
第4个月:2+1=3(第1个数2表示上个月的兔子数,第2个数1表示一开始的兔子又生了一对小兔子)
第5个月:3+2=5(第1个数3表示上个月的兔子数,第2个数2表示一开始的老兔子又生了一对小兔子+老兔子的孩子生的一对小兔子,实在便是上上个月的兔子数,上上个月有几对兔子,就会再生几对小兔子)
第6个月:5+3=8
第7个月:8+5=13
由上面的剖析可以得到一个规律,便是目前的兔子对数,便是上个月的兔子数+上上个月的兔子数
(实在这个规则,通过数字1 1 2 3 5 8 13….的规律也可以看出来,这便是著名的斐波那契数列。)
参考程序
这个程序可以采取两种办法来实现:
一是采取循环
#include <stdio.h>int main(){ int i,n,llnum=1,lnum=1,temp; scanf(\"大众%d\公众,&n); for(i=3;i<=n;i++) { temp=lnum; //把上个月的兔子对数放到一个临时变量里面,由于这个数会成为上上个月的兔子对数 lnum=lnum+llnum;//上个月的兔子对数+上上个月的兔子对数,然后给lnum llnum=temp;//把临时变量中的兔子对数给上上个月的变量 } printf(\"大众%d\n\"大众,lnum); return 0;}
什么时候用递归?如果规律中涌现可以用同一种办法来干工作的情形,就可以用递归了,这里有的同学说,循环也是用同一种办法来干工作,对了,以是递归是可以用循环来实现的。
对付兔子繁殖问题可以这样来写,假设用N(n)表示第n个月的兔子对数,那么N(n)=N(n-1)+N(n-2) ;个中N(n-1)表示 上个月的兔子数,N(n-2)表示上上个月的兔子数。
要把稳的问题,递归要有递归跳出的条件,如果没有这种跳出条件,程序就会去世掉,就象盗梦空间一样,去世在梦里了。
对付这个题目,跳出条件是什么,也便是说是不是能够找到n知足一定条件的时候能有一个详细的值,而不是再去调用自身。这个题目中,N(1)=1,N(2)=1
#include <stdio.h>int fun(int month){ if(month==1){ return 1;//第1个月,1对兔子,递归的跳出条件 } if(month==2){ return 1;//第2个月,1对兔子,递归的跳出条件 } else return fun(month-1)+fun(month-2); //返回上个月的兔子对数+上上个月的兔子对数}int main(){ int n; scanf(\"大众%d\"大众,&n); printf(\"大众%d\n\"大众,fun(n)); return 0;}