首页 > 解决方案 > 为什么这段代码会导致堆栈溢出?为什么只需将 ==1 更改为 <2,然后它就可以工作了?

问题描述

下面是递归斐波那契的代码,它会导致堆栈溢出错误。为什么只是将条件从 n==1 更改为 n<2 就可以了?

考虑正常的斐波那契函数:F(n) = F(n - 1) + F(n - 2)。该函数可以在这里表示为 F(n) = calculate(n, 2)。

这里的概念是 calculate(n, x) = calculate(n - 1, x) + calculate(n - 2, x) + calculate(n - 3, x) + ...+ calculate(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;
        }
    }
}

标签: javastack-overflow

解决方案


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

例如, ifn == 2x == 2,calculate(n - i, x)变成calculate(0,2)when i == x

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


推荐阅读