7

我在 Eclipse IDE 中用 Java 实现了一个阶乘函数。

public class Utilities {
   public static int factorial(int n) {
        int result;
    if (n <= 1) // base case
        return 1;
    else {
        result = (n * factorial(n - 1));
        return result;
    }
}
}

在 Eclipse 的显示中,我检查Utilities.factorial(6). 但是,我收到此错误。

Utilities.factorial(6);
    Evaluation failed. Reason(s):
        Cannot perform nested evaluations.

为什么显示器不支持递归调用?那是问题吗?

4

3 回答 3

10

要返回答案,它必须评估表达式,为此它必须评估内部表达式,为此它必须评估内部表达式,为此它必须评估内部表达式。

通常,当调试器破坏堆栈(嵌套堆栈帧过多)时,人们会将错误提交给编写调试器的开发团队。他们通过目前已知的唯一方法解决了问题:不递归。

对于任何递归表达式,如果您可以在不以嵌套方式评估表达式的情况下评估堆栈需要走多深;有一个闪亮的菲尔兹奖章在等着你(可能还有一所大学准备以你的名义建造一座新建筑)。这个问题与停机问题有关,不幸的是,使用我们的计算模型,已知停机问题是无法解决的。

于 2012-05-15T21:45:12.583 回答
4

罪魁祸首:递归

大多数 IDE 不会进行这种评估,它与 Java 无关,更多地与递归有关。由于 Eclipse 无法知道递归的深度,它甚至不会费心评估表达式,否则它可能会挂起 JVM(如果递归有问题)或导致“堆外”异常,无论哪种情况,很难挽回。

您是否为哨兵尝试过较小的数字,例如Utilities.factorial(1)

于 2012-05-15T19:21:44.940 回答
-1

不相关:如果这是您真正想要使用的方法,则递归不是要走的路。至少,将函数重写为迭代函数。根据您的用例,您可以使用各种近似值,例如this onethis one

于 2012-05-15T21:35:10.043 回答