Fibonacci兔子到期了

时间:2013-10-01 23:26:49

标签: java recursion fibonacci

我正在尝试开发经典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;
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您为x=5描述的输出是错误的(应该是1,1,2,3,5,7,11,17,26,40 ......),而且您的代码没有'为任何x > 2产生正确的结果。

x是生命的总年数(包括婴儿期),因此对于x = 1 x = 2你应该得到(1,0,0,...)你应该获得所有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;
}

希望这有帮助。