下面是递归斐波那契代码,它会引起stackoverflowerror。为什么仅将条件从n == 1更改为n <2使其起作用?
考虑正常的斐波那契函数:F(n)= F(n-1)+ F(n-2)。该函数在这里可以表示为F(n)= calculate(n,2)。
这里的概念是calculate(n,x)=计算(n-1,x)+计算(n-2,x)+计算(n-3,x)+ ... +计算(n- x,x);
public static int calculate(int n, int x) {
if (n == 1) {
return n;
}
else {
int output = 0;
for (int i = 1; i <= x; i++) {
output += calculate(n - i, x);
}
return output;
}
}
}
答案 0 :(得分:1)
当您的停止条件仅为n == 1
时,calculate
不会停止,如果您将其传递给0
或为负值,这就是您在循环中所做的事情。
例如,如果n == 2
和x == 2
,则calculate(n - i, x)
在calculate(0,2)
时变成i == x
。
因此,if (n <= 1)
或if (n < 2)
是正确的停止条件。