1

我正在尝试开发代码以调整经典的 Fib 兔子。在这种情况下,它们会在出生后 x 代过期。下面的链接中有一个示例:

http://matheminutes.blogspot.com/2012/02/killing-fibonaccis-rabbits.html

我理解显示 x=2 情况的链接中途的表格(兔子在 2 年后到期)(表格有 5 列,其中第 1 列 =“年份”,第 2 列 =“新生兔子对”,列3 =“成对的新成熟兔子”,第 4 列 =“成对的真正成熟的兔子”,第 5 列 =“总计”)。

根据这张表,每年的兔子总数遵循1、1、2、2、3、4、5、7、9、...的顺序。

我开发的代码似乎适用于 x>2 值(例如,当我设置 x=5 时,我得到系列:1、1、2、3、5、7、11、16、24、35 等。 ,我认为这是正确的)。

但是,我的代码似乎不适用于两种情况:x=2(我得到所有 1,当我应该得到系列 1、1、2、2、3、4、5、7、9,...)和 x=1 (我得到 1, 0, 1, 0, 1, 0,当我应该根据上面的链接得到所有 1 时)。

我的代码如下(目前为前 22 个数字设置 x=5):

public class TestFib {

        public static void main(String args[]) {
        int x = 5;
        for (int i = 1; i < 22; i++) {
            System.out.println("n = " + i + ", " + DeadRabbits(i, x));
        }
    }

    public static int DeadRabbits(int n, int x) {
            int Fn;
        if (n == 0) {
            Fn = 0;
        }       
        else if (n == 1) {
            Fn = 1;
        }
        else if (n < x ) {
            Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x);
        }
        else {
            Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x)
                - DeadRabbits(n - x, x);
        }
        return Fn;
    }
}
4

1 回答 1

0

首先,您描述的输出x=5是错误的(应该是 1, 1, 2, 3, 5, 7, 11, 17, 26, 40,...),并且您的代码不会为任何x > 2.

x是生命的总年数(包括婴儿期),因此x = 1你应该得到 (1, 0, 0, ...),因为x = 2应该 得到所有 1,并且,x=3你得到 1, 1, 2, 2 , 3, 4, 5, 7, 9,... 等等。

我修复了你的函数,现在它为任何输入产生正确的输出,你有一个丢失的特殊情况,n = x + 1由于系列的初始化而创建,最后一种情况下的减法应该用n - x -1

public static int DeadRabbits(int n, int x) {
    int Fn;
    if (n < 1) {
        Fn = 0;
    }       
    else if (n == 1) {
        Fn = 1;
    }
    else if (n < x + 1) {
        Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x);
    }
    else if (n == x + 1) {
        Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x) - 1;
    }
    else {
        Fn = DeadRabbits(n - 1, x) + DeadRabbits(n - 2, x)
            - DeadRabbits(n - x - 1, x);
    }
    return Fn;
}

希望这可以帮助。

于 2013-10-02T13:39:00.793 回答