Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

查看所有50道基础算法题请看:

Java的50道基础算法题

递归的方法

package Demo02Rabbits;
import java.util.Scanner;
public class Rabbits_Birth {
    /**
     * 古典兔子生娃问题:
     * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
     * 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
     */
    /*
        分析:第一个月只有1对兔子,
             第二个月也只有一对儿兔子
             第三个月开始生了,所以有1+1=2对兔子
             第四个月又生一对,所以有1+1+1=3对兔子
             第五个月又生一对,而且第三个月的孩子也开始生了,所以有3+1+1=5对兔子
             第六个月又生一对,而且第三个月的孩子也生了一对,第四个月的孩子也开始生了,所以有5+1+1+1=8对兔子
             第七个月又生一对,而且第三个月第四个月的孩子也各生一对,第三个月的孩子的孩子也可以生了,
         第五个月的孩子也可以生了,所以有8+1+1+1+1+1=13对兔子
             ...
         找规律: 月份:   1  2   3   4   5   6   7
             兔子总数:   1  1   2   3   5   8   13
         可以看出,从第三个月开始,当月的兔子总数是前两个月兔子的和即:
             sum(month)=sum(month-2)+sum(month-1);
    */
    public static void main(String[] args) {
        //获取启动时时间戳
        long start = System.currentTimeMillis();
        // 获取用户输入的要查询的月份
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要查看第几月兔子的总数?");
        int month = sc.nextInt();
        // 调用sum方法,计算总共有多少只兔子
        System.out.println("第"+month+"个月,总共有"+sum(month)+"对兔子。");
        System.out.println("第"+month+"个月,总共有"+sum(month)*2+"只兔子。");
        // 获取程序结束时间戳并计算打印程序运行时间
        long ends = System.currentTimeMillis();
        System.out.println("本次计算共耗时:"+ (ends-start)+"毫秒");
    }
    // 构建一个递归方法
    public static long sum(int month){
        //递归的目的:获取前两个月的兔子总数,一二月份都只有一对儿兔子
        if((month==1) || (month==2)){
            return 1;
        }else{
            return (sum(month-2)+sum(month-1));
        }
    }
}

循环的方法

package Demo02Rabbits;
import java.util.Scanner;
public class Rabbits_Birth_For {
    /**
     * 古典兔子生娃问题:
     * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
     * 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
     */
    /*
        分析:第一个月只有1对兔子,
             第二个月也只有一对儿兔子
             第三个月开始生了,所以有1+1=2对兔子
             第四个月又生一对,所以有1+1+1=3对兔子
             第五个月又生一对,而且第三个月的孩子也开始生了,所以有3+1+1=5对兔子
             第六个月又生一对,而且第三个月的孩子也生了一对,第四个月的孩子也开始生了,所以有5+1+1+1=8对兔子
             第七个月又生一对,而且第三个月第四个月的孩子也各生一对,第三个月的孩子的孩子也可以生了,
         第五个月的孩子也可以生了,所以有8+1+1+1+1+1=13对兔子
             ...
         找规律: 月份:   1  2   3   4   5   6   7
             兔子总数:   1  1   2   3   5   8   13
         可以看出,从第三个月开始,当月的兔子总数是前两个月兔子的和即:
             sum(month)=sum(month-2)+sum(month-1);
    */
    public static void main(String[] args) {
        //获取启动时时间戳
            long start = System.currentTimeMillis();
            // 获取用户输入的要查询的月份
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你要查看第几月兔子的总数?");
            int month = sc.nextInt();
            // 调用sum方法,计算总共有多少只兔子
            System.out.println("第"+month+"个月,总共有"+sum(month)+"对兔子。");
            System.out.println("第"+month+"个月,总共有"+sum(month)*2+"只兔子。");
            // 获取程序结束时间戳并计算打印程序运行时间
            long ends = System.currentTimeMillis();
            System.out.println("本次计算共耗时:"+ (ends-start)+"毫秒");
    }
    // 构建一个for循环的方法
    public static long sum(int month){
        long count =0;
        long F1 = 1;
        long F2 = 1;
        if((month==1) || (month==2)){
            return 1;
        }else{
            for (int i = 3; i <= month; i++) {
                count = F1+F2;
                F1=F2;
                F2=count;
            }
            return count;
        }
    }
}

你可能感兴趣的:(Java算法题,java)