注册 登录
编程论坛 JAVA论坛

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?大佬们这个哪里出问题了

坠空 发布于 2022-12-09 10:02, 3242 次点击
public class Prog1{

       public static void main(String[] args){

              int n = 10;

              System.out.println("第"+n+"个月兔子总数为"+fun(n));

       }

       private static int fun(int n){

              if(n==1 || n==2)

                 return 0;

              else

                 return fun(n-1)+fun(n-2);

       }

}

[此贴子已经被作者于2022-12-10 08:10编辑过]

3 回复
#2
加法2022-12-12 11:36
if里面应该是return 1;一开始就存在一对兔子
#3
沈和2023-04-19 21:10
这像是一道数列问题。

n = 1, a1 = 1
n = 2, a2 = 1
n = 3, a3 = 1 + 1 = a2 + a1
n = 4, a4 = 2 + 1 + 1 = a3 + a2 + a1

a[n+1] = Sn

通过观察可知有一下规律,可以通过不完全归纳法证明
a1 = 1
n>1, an = 2^(n-2)

程序代码:

    private static int rabbits(int n){
        if (n == 1) {
            return 1;
        }
        else {
            return 1 << (n-2);
        }
    }


////////

上面的分析写错了。

n = 1, 小兔子 1 只
n = 2, 大兔子 1 只
n = 3, 大兔子 1 只 + 小兔子 1 只
n = 4, 大兔子 2 只 + 小兔子 1 只
n = 5, 大兔子 3 只 + 小兔子 2 只

a[n] = a[n-1] + a[n-2]

程序代码:

    private static int rabbits(int n){
        if (n == 1 || n == 2) {
            return 1;
        }
        else {
            return rabbits(n-1) + rabbits(n-2);
        }
    }


[此贴子已经被作者于2023-4-21 21:10编辑过]

#4
东海ECS2023-04-21 19:06
这个程序存在以下问题:

1.程序中的fun函数的返回值不正确。

2.程序没有考虑兔子的繁殖能力,只是递归调用自身。

下面是修改后的代码:

程序代码:
public class Prog1 {

    public static void main(String[] args) {
        int n = 10;
        System.out.println("第" + n + "个月兔子总数为" + fun(n));
    }

    private static int fun(int n) {
        if (n == 1 || n == 2)
            return 1; // 第1个月和第2个月都只有一对兔子
        else
            return fun(n - 1) + fun(n - 2) * 2; // 递归计算兔子总数
    }

}

修改后的程序中,fun函数的返回值表示第n个月的兔子总数,根据题目规定,每对兔子在第三个月后都可以繁殖,因此第n个月的兔子总数相当于第n-1个月的兔子总数加上第n-2个月的兔子总数乘以2。在第n-1个月的兔子总数中包含了第n-2个月的兔子总数,因此需要将第n-2个月的兔子总数乘以2,避免重复计算。最后,第1个月和第2个月的兔子总数都是1对。
1