牛客网华为机试【统计每个月兔子的总数】

文章目录

  • 题目描述
  • 题目分析
  • java 代码(递归)
  • java 代码(非递归)
  • 结果

题目描述

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

/**
 * 统计出兔子总数。
 * 
 * @param monthCount 第几个月
 * @return 兔子总数
 */
public static int getTotalCount(int monthCount){
     
    return 0;
}

输入描述:
输入int型表示month

输出描述:
输出兔子总数int型

示例
输入

9

输出

34

题目分析

知道斐波那契数列的话,就不用看我这分析了。

假设将兔子分为小中大三种,兔子从出生后三个月后每个月就会生出一对兔子,

那么我们假定第一个月的兔子为小兔子,第二个月为中兔子,第三个月之后就为大兔子,那么第一个月分别有1、0、0,第二个月分别为0、1、0,

第三个月分别为1、0、1,第四个月分别为,1、1、1,第五个月分别为2、1、2,第六个月分别为3、2、3,第七个月分别为5、3、5……

兔子总数分别为:1、1、2、3、5、8、13……

从第3个月开始,前两个月的兔子之和等于下一个月。
可以看到 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8 等等。

递归:递归的斐波那契数列

java 代码(递归)

import java.util.Scanner;

/**
 * Created by Feng on 2020/2/21 15:05
 * CurrentProject's name is java8
 * 兔子算法 ,即斐波那契数列
 */
public class Main {
     
    public static void main(String[] args) {
     
        Scanner input = new Scanner(System.in);
        while (input.hasNextInt()){
     
            System.out.println(getTotalCount(input.nextInt()));
        }
    }

    /**
     * 兔子总数
     * @param monthCount 月份
     * @return 兔子总数
     */
    private static int getTotalCount(int monthCount){
     
        if(monthCount < 3){
     
            return 1;
        }

        return getTotalCount(monthCount - 2) + getTotalCount(monthCount - 1);
    }
}

java 代码(非递归)

private static int getTotal(int monthCount){
     
    int a = 1;
    int b= 1;
    // 总数
    int result = 1;

    for (int i = 2; i < monthCount; i++) {
     
        result = a + b;
        a = b;
        b = result;
    }
    
    return result;
}

结果

牛客网华为机试【统计每个月兔子的总数】_第1张图片

你可能感兴趣的:(牛客网华为机试,java,斐波那契数列,兔子总数,递归和非递归解法)