兔子生兔子问题(斐波那契数列)
一道经典的算法问题。
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死,要求输出一年内兔子的数量是多少。
1 1 2 3 5 8……
代码如下:
//兔子问题(斐波那契)
package com.hxzy.homework;public class HomeWork05 { public static void main(String[] args) { // TODO Auto-generated method stub int month = 12; int sum = fab(month); System.out.println(sum); //按兔子繁殖规律 System.out.println(fab_1(month)); //按斐波拉契 }//--------按兔子繁殖规律 static int fab(int month){ if(month<=2) return 1; else if(month==3) return 2; else return 2*fab(month-1)-fab(month-3);// 即 return fab(month-1) +(fab(month-1)-fab(month-2)) +(fab(month-2)-fab(month-3));// 返回值为,上月兔子数+上月增加的兔子数+两个月前新增兔子数 }//--------------按斐波拉契
static int fab_1(int n){ if(n<=2) return 1; else return fab_1(n-1)+ fab_1(n-2); }}
用递归法求解最简单,上面代码fab()是根据题意写出的代码。由于兔子第三个月开始会生小兔子,所以此道题目的关键逻辑是:
本月兔子数=上月兔子数 + 上月增加的兔子数 + 两个月前新增兔子数,
即:fab(n) = fab(n-1) +(fab(n-1)-fab(n-2)) + (fab(n-2)-fab(n-3));
亦即:fab(n)=2*fab(n-1) - fab(n-3)
这一逻辑较斐波那契数列更好理解。

浙公网安备 33010602011771号