我正在尝试开发经典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;
}
}
答案 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;
}
希望这有帮助。