小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
分析:根据题目可以得出的是(以对考虑问题 不要把它换算为只) 1月:1对 1月:1对 2月:1对 3月:2对 4月:3对 5月:5对 6月:8对
可以得出的规律是:第n月的兔子是由:前2个月对数*2+前一个月增加的数, 那么也可以简单算法就是: 第n个月的兔子数是:前一个月和前两个月的和 第一种方法就是使用暴力破解(有时暴力破解也不失为一种方法)
public class title01 {
public static void main(String[] args) {
int sum[] = new int[12];
for(int i =1 ;i <= 12; i++){
if(i == 1 || i==2){
sum[i-1] = 1;
}else{
sum[i - 1] = sum[i-2]+sum[i-3];
}
}
for(int i = 0; i<12 ; i++){
System.out.println( i+1+ "月: " + sum[i] + " 对");
}
}
第二种方法 是使用递归算法
public class title01_1 {
public static int sum(int n){
if(n >= 13){
return 0;
}
if(n == 1 || n == 2){
return 1;
}else{
return sum(n-1) + sum(n-2);
}
}
public static void main(String[] args) {
for(int i = 1; i<= 12; i++){
System.out.println(i + "月:" + sum(i) + "对");
}
}
}
其实上面这个问题就是斐波那契数列的一个使用(斐波那契数列就是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610的这样一个数列,第0项是0,第1项是第一个1,数列从第三项开始,每一项都等于前两项之和)他的实现也就从上面将不死兔那个例子中看出 他的实现可以看到使用递归就能一目了然他的思想。当然他的实现方式有很多 而递归应该是相对比较好实现好理解的一个方法