我在Eclipse IDE中用Java实现了一个factorial函数。
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.
为什么显示器不支持递归调用?这是问题吗?
答案 0 :(得分:9)
要返回答案,它必须评估表达式,为此必须评估内部表达式,为此必须评估内部表达式,为此必须评估内部表达式。
通常,当调试器烧坏堆栈(嵌套堆栈帧太多)时,人们会向编写调试器的开发团队提交错误。他们通过目前已知的唯一手段来解决问题:没有递归。
如果您可以评估堆栈在不以嵌套方式评估表达式的情况下需要多深,对于任何递归表达式;有一个闪亮的Fields Medal等着你(可能是大学准备以你的名义建造一座新建筑)。这个问题与the Halting Problem有关,不幸的是,在我们的计算模型中,已知暂停问题无法解决。
答案 1 :(得分:4)
大多数IDE都不会进行这种评估,它与Java无关,而与递归有关。由于Eclipse无法知道递归的深度,因此它甚至无法评估表达式,否则它可能会挂起JVM(如果递归是错误的)或导致“out of heap”异常,在任何一种情况下,很难恢复。
您是否尝试过较小的哨兵号码,例如: Utilities.factorial(1)
?
答案 2 :(得分:-1)