题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1 最直观的一种方法
package 兔子问题;
public class Rabbit {
int age;
public Rabbit(){
this.age=0;
}
public void setAge(){
this.age++;
}
public int getAge(){
return this.age;
}
public Rabbit born(){
return new Rabbit();
}
}
package 兔子问题;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
String temp;
int monthNum;
boolean run=true;
while(run){
System.out.println("请输入月份或者是exit退出");
temp=sc.nextLine();
if(temp.trim().equals("exit")){
System.out.println("系统退出了");
System.exit(0);
}else{
monthNum =Integer.parseInt(temp.trim());
System.out.println(getNum(monthNum));
}
}
}
public static int getNum(int n){
int num=1;
ArrayList rabbitArray =new ArrayList();
rabbitArray.add(new Rabbit());
for(int i=1;i<=n;i++){
for(int j=0;j
rabbitArray.get(j).setAge();
if(rabbitArray.get(j).getAge()>=3)
rabbitArray.add(rabbitArray.get(j).born());
}
}
num=rabbitArray.size();
return num;
}
}
2 通过分析题目我们发现:
题目分析:
* 第一个月: 兔子共1只
* 第二个月: 兔子共1只
* 第三个月: 兔子共2只
* 第四个月: 兔子共3只
* 第五个月: 兔子共5只
* 第六个月: 兔子共8只
* 第七个月: 兔子共13只
* 从中发现,从第三个月开始,前两个月兔子数之后为第三个兔子总数
故有程序:
package 兔子问题;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String temp;
int monthNum;
boolean run=true;
while(run){
System.out.println("请输入月份或者是exit退出");
temp=sc.nextLine();
if(temp.trim().equals("exit")){
System.out.println("系统退出了");
System.exit(0);
}else{
monthNum=Integer.parseInt(temp.trim());
System.out.println(getNum(monthNum));
}
}
}
public static int getNum(int monthNum){
int pre1,pre2,now;
int i=0;
pre1=pre2=now=1;
if(monthNum<=0)
return 0;
if(monthNum==1||monthNum==2)
return now;
for(i=3;i<=monthNum;i++){
now=pre1+pre2;
pre1=pre2;
pre2=now;
}
return now;
}
}
3 在方法二的思路上使用迭代方法,程序如下:
package 兔子问题;
import java.util.Scanner;
/**
* 采用迭代方法
* **/
public class Main3 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String temp;
int monthNum;
boolean run=true;
while(run){
System.out.println("请输入月份或者是exit退出");
temp=sc.nextLine();
if(temp.trim().equals("exit")){
System.out.println("系统退出了");
System.exit(0);
}else{
monthNum=Integer.parseInt(temp.trim());
System.out.println(getNum(monthNum));
}
}
}
public static int getNum(int n){
if(n==0)
return 0;
if(n==1|n==2){
return 1;
}
else{
return getNum(n-1)+getNum(n-2);
}
}
}