【问题标题】:Java Returns Nothing RecursionJava没有返回任何东西
【发布时间】:2015-02-11 19:37:34
【问题描述】:
所以我在 Java 教科书中找到了这段代码,它是一段递归代码。我真的不明白当什么都不返回时会发生什么(“return;”),它也没有在教科书中解释。我尝试在互联网上搜索它,但也找不到任何答案。
public static void numbers(int n) {
if (n == 0) {
throw new IllegalArgumentException();
}
if (n == 1) {
System.out.print(n);
return;
}
numbers(n - 1);
System.out.print(", " + n);
}
【问题讨论】:
标签:
java
recursion
return
return-value
return-type
【解决方案1】:
此方法的目的是打印从 1 到 n 的数字序列,以逗号分隔,并且不向其调用者返回任何内容。
所以这就是它的工作原理(尝试在你的脑海中模拟 - 我对这些行进行了编号以方便我的参考。):
1: public static void numbers(int n) {
2: if (n == 0) {
3: throw new IllegalArgumentException();
4: }
5: if (n == 1) {
6: System.out.print(n);
7: return;
8: }
9: numbers(n - 1);
10: System.out.print(", " + n);
11: }
如果使用 1 作为参数 (n = 1) 调用它,则第 5 行中的表达式为真,第 6 行将“1”打印到输出,并且该方法在第 7 行返回给它的调用者。
如果使用 2 作为参数调用它,第 5 行中的表达式将失败,跳过 if 块,第 9 行以 n - 1 (=1) 作为参数调用 number 方法,导致显示“1”(如图所示在前一种情况下)。然后 CPU 返回到它的调用者并继续执行第 10 行,该行将 ", 2" 打印到输出。最终输出为“1, 2”。
如果以 3 作为参数调用它,第 9 行以 2 作为参数调用 numbers 方法,导致输出“1, 2”(如上例所示),然后打印“, 3”(在第 10 行),结果在 "1, 2, 3" 作为输出。
等等……
【解决方案2】:
"返回;"在 void 函数中与“return val;”具有相同的含义;在非空函数中。
所以,“返回;”在示例中的意思是“到这里函数结束,并返回到函数调用的调用位置。”
你也可以这样想:每个 void 函数的末尾都有一个“return;”,但为了简洁,它们总是被省略掉。
【解决方案3】:
该(示例)方法的目的是打印一个数字。它不是为了返回任何东西而设计的。
我真的不明白什么都不返回(“return;”)时会发生什么,它也没有在教科书中解释。
嗯......“发生”的是没有返回任何内容。
但这没关系,因为recursion 方法被声明为void 方法。事实上,如果您确实 尝试返回一个值或分配调用结果,您会得到编译错误。 (试试看!)
请注意,这适用于 Java 中的所有方法/方法调用,而不仅仅是递归的。
(它很可能确实在您的教科书中解释了这一点,但在比您现在正在阅读的部分更早的部分中。教科书通常是在假设您将从头开始阅读文本的前提下编写的...... )
【解决方案4】:
虽然代码没有return 任何东西,但它确实采取了改变事情的行动,在这种情况下,将某些内容打印到输出中。
如果 n 为 1,它只会打印 1。
如果n 为2,则调用numbers(1)。如上所述,打印出1。然后它返回给调用者,即numbers 和n==2。调用者从numbers(n-1) 之后的语句开始,因此打印, 2。因此,输出为1, 2。
如果n 为3,则调用numbers(2)。如上一段所述,这会使用另一个递归调用输出1, 2。然后它返回给调用者,即numbers 和n==3。调用者从numbers(n-1) 之后的语句开始,因此打印, 3。因此,输出为1, 2, 3。
所以基本上,numbers(n) 的输出(对于n > 1)只是numbers(n-1) 的输出,后面有一个逗号和n。
【解决方案5】:
当n 为1 时,它会打印n (1),然后停止递归(return; 展开堆栈帧并返回给调用者)。在这种情况下,那是 n 为 2 的时候。然后方法体结束(相当于 return;)所以它再次发生(3)......