Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java不返回任何递归_Java_Recursion_Return_Return Value_Return Type - Fatal编程技术网

Java不返回任何递归

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);

所以我在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);
}

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: }