为什么此代码会导致堆栈溢出?为什么只将== 1更改为<2,然后起作用?

时间:2019-04-14 15:14:19

标签: java stack-overflow

下面是递归斐波那契代码,它会引起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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当您的停止条件仅为n == 1时,calculate不会停止,如果您将其传递给0或为负值,这就是您在循环中所做的事情。

例如,如果n == 2x == 2,则calculate(n - i, x)calculate(0,2)时变成i == x

因此,if (n <= 1)if (n < 2)是正确的停止条件。