【问题标题】: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。然后它返回给调用者,即numbersn==2。调用者从numbers(n-1) 之后的语句开始,因此打印, 2。因此,输出为1, 2

          如果n 为3,则调用numbers(2)。如上一段所述,这会使用另一个递归调用输出1, 2。然后它返回给调用者,即numbersn==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)......

            【讨论】:

              猜你喜欢
              • 2012-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-17
              • 2019-04-22
              • 1970-01-01
              • 2014-04-28
              • 2011-05-04
              相关资源
              最近更新 更多