5.8 递归方法

介绍了条件语句后,现在可以探索程序能做的最神奇的事情之一了——递归(recursion)。思考下面的示例:

  1. public static void countdown(int n) {
  2. if (n == 0) {
  3. System.out.println("Blastoff!");
  4. } else {
  5. System.out.println(n);
  6. countdown(n - 1);
  7. }
  8. }

这个方法名为 countdown,它将一个整数作为参数。如果这个参数为零,它就显示单词 Blastoff,否则就显示这个数字,再用实参 n-1 调用自己。调用自己的方法称为递归方法(recursive method)。

如果在 main 中调用 countdown(3),结果将如何?

  1. 这次执行 countdown 时,n==3;由于 n 不为零,因此它显示值3,再调用自己……
  2. 这次执行 countdown 时,n==2;由于 n 不为零,因此它显示值2,再调
  3. 用自己……
  4. 这次执行 countdown 时,n==1;由于 n 不为零,因此它显示值
  5. 1,再调用自己……
  6. 这次执行 countdown 时,n==0;由于n 为零,因此它
  7. 显示值“Blastoff!”再返回。
  8. 使用 1 调用的 countdown 返回。
  9. 使用 2 调用的 countdown 返回。
  10. 使用 3 调用的 countdown 返回。

至此返回了 main,于是输出类似于下面这样:

  1. 3
  2. 2
  3. 1
  4. Blastoff!

再来看一个示例。在这个示例中,我们将重新编写 4.3 节中的方法 newLinethreeLine

  1. public static void newLine() {
  2. System.out.println();
  3. }
  4. public static void threeLine() {
  5. newLine();
  6. newLine();
  7. newLine();
  8. }

虽然这些方法管用,但如果要显示 2 个或 100 个空行,它们并不能提供帮助。下面是一种更佳的解决方案:

  1. public static void nLines(int n) {
  2. if (n > 0) {
  3. System.out.println();
  4. nLines(n - 1);
  5. }
  6. }

这个方法将一个整数(n)作为形参,并显示了 n 个空行。其结构与 countdown 类似:只要 n 大于零,就显示一个空行,然后调用自己再显示 n-1 个空行。显示的总空行数为 1+(n - 1),即我们希望的 n 个。