【发布时间】:2015-03-22 05:39:30
【问题描述】:
我对 Java 编程比较陌生,并且刚刚开始学习递归,但我似乎无法弄清楚这种方法是如何在我的脑海中工作的。
private static int mystery(int w) {
{
if (w < 0) return 0;
int x = mystery (w-2);
return w - x;
}
}
每当输入像100这样的变量时,输出50。输入200时,输出100。输入2时,输出2。输入25时,输出13。我不确定这种方法是如何工作的,我正试图绕过它。
我目前的看法,如果你输入100,它会绕过第一个return语句,因为它大于0。 当它到达第二行时,它会执行 100-2,这会带来 98,然后到第三行并执行 100 - 98 = 2。然后返回到原始调用。
我知道我搞砸了谜题 (w-2) 所在方法的第二行。我假设它会将 w-2 的结果再次带回到方法的开头,并且它将继续一遍又一遍地执行该方法,直到 w 小于 0,无论答案如何,它都应该再次输出 0。但这不是发生的事情,我不知道为什么。
谁能解释这里发生了什么?
【问题讨论】:
-
阅读 SICP 书,它解释了这一点以及编程中的许多其他重要思想。还要确保正确格式化您的代码,否则一些愤怒的程序员会否决您的问题。
-
直到第二行解决后才进入第三行。在上面的例子中,当你到达神秘(w-2)时,你调用神秘(98)......然后在那个调用内部,它会在第二行调用神秘(96)......
-
在函数上添加一些 println 调用并运行它。
-
此外,此代码将在较大的
w值上溢出堆栈