Java不返回任何递归
所以我在Java教科书中找到了这段代码,它是一段递归代码。我真的不明白当什么都没有返回(“return;”)时会发生什么,教科书中也没有解释。我试着在网上搜索,但也找不到任何答案Java不返回任何递归,java,recursion,return,return-value,return-type,Java,Recursion,Return,Return Value,Return Type,所以我在Java教科书中找到了这段代码,它是一段递归代码。我真的不明白当什么都没有返回(“return;”)时会发生什么,教科书中也没有解释。我试着在网上搜索,但也找不到任何答案 public static void numbers(int n) { if (n == 0) { throw new IllegalArgumentException(); } if (n == 1) { System.out.print(n);
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);
}
当
n
为1时,它打印n
(1),然后停止递归(返回;展开堆栈帧并返回调用方)。在这个例子中,n是2。然后,方法主体结束(相当于返回;
),因此它再次发生(3).该(示例)方法的目的是打印一个数字。它不是用来归还任何东西的
我真的不明白当什么都没有返回(“return;”)时会发生什么,教科书中也没有解释
嗯。。。“发生”的是什么都不返回
但这没关系,因为递归
方法被声明为void
方法。事实上,如果您试图返回一个值,或者分配调用的结果,您将得到编译错误。(试试看!)
注意,is适用于Java中的所有方法/方法调用,而不仅仅是递归调用
(它很可能在您的教科书中解释了这一点,但在您现在看到的之前的章节中。教科书通常是基于您将从头开始阅读的假设编写的…)尽管代码不会返回任何内容,但它确实会采取措施来改变事情,在这种情况下,将某些内容打印到输出 如果
n
为1,则只打印1
如果n
为2,则调用numbers(1)
。如上所述,它打印1
。然后它返回调用者,调用者是numbers
,其n==2
。调用者从数字(n-1)
之后的语句开始,然后打印,2
。因此,输出是1,2
如果n
为3,则调用numbers(2)
。如前一段所述,它使用另一个递归调用输出1,2
。然后它返回给调用者,调用者是numbers
,其中n==3
。调用者从数字(n-1)
之后的语句开始,然后打印,3
。因此,输出是1、2、3
所以基本上,numbers(n)
(对于n
>1)的输出就是numbers(n-1)
的输出,后面有逗号和n
无效函数中的“return;”与非无效函数中的“return val;”具有相同的含义。
因此,在本例中,“return;”表示“函数到此结束,并返回函数调用的调用位置。”
您还可以这样想:在每个void函数的末尾,都有一个“return;”,但为了简洁起见,它们总是被忽略。此方法的目的是打印一个由逗号分隔的从1到n的数字序列,并且不向其调用者返回任何内容。 下面是它的工作原理(试着在你的头脑中模拟——我给这些行编号以便于参考): 如果使用1作为参数(n=1)调用它,则第5行中的表达式为true,第6行向输出输出输出“1”,该方法在第7行返回其调用方。
如果使用2作为参数调用它,第5行中的表达式将失败,
如果跳过
块,第9行将使用n-1(=1)作为参数调用number方法,导致显示“1”(如前一个案例所示)。然后CPU返回其调用者并继续执行第10行,该行将“2”打印到输出。最终输出为“1,2”。如果使用3作为参数调用它,第9行使用2作为参数调用numbers方法,结果是输出“1,2”(如前一个例子所示),然后打印“3”(在第10行中),结果是输出“1,2,3”。
等等
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: }