题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
看到题目,我首先拿笔列了一下,每个月的情况,如下:
1个月 1对
2个月 1对
3个月 2对
4个月 3对
5个月 4对
6个月 6对
7个月 9对
我们可以看出,最后一个月的数据是前一个月的数据加上前3个月的数据,比如:7个月的对数=6个月的对数+4个月的对数;6个月的对数=5个月的对数+3个月的对数。因兔子出生是3个月能生小兔子。
由上面的规律,我们可以总结出,Sn=S(n-1) + S(n-3)
我们可以采用递归的方法,来计算,代码如下:
public static void main(String[] args) {
for(int i = 1; i <=12; i++) {
System.out.println("第" + i + "个月,兔子的总对数:" + getRebbitSum(i));
}
}
/**
* 获取兔子的总数,试着用递归的方法写下
* 其实就是Sn = S(n-1) + S(n-3)
* @param n 月数
*/
public static int getRebbitSum(int n) {
if(n <= 2) {
return 1;
}
return getRebbitSum(n-1) + getRebbitSum(n-3);
}
执行结果如下图:
其实递归算法的效率还是挺低的,等我有时间写个非递归方法补充上。