原文: https://www.programiz.com/java-programming/recursion

在本教程中,您将学习 Java 递归函数及其优缺点。

在 Java 中,调用自身的方法被称为递归方法。 并且,此过程称为递归。

一个物理世界的例子是放置两个相互面对的平行反射镜。 它们之间的任何对象都将递归地反映出来。


递归如何工作?

Java 递归 - 图1

Java 递归的原理

在上面的示例中,我们从main方法内部调用了recurse()方法。 (正常方法调用)。 并且,在recurse()方法内部,我们再次调用相同的recurse方法。 这是一个递归调用。

为了停止递归调用,我们需要在方法内部提供一些条件。 否则,该方法将被无限调用。

因此,我们使用if...else语句(或类似方法)来终止方法内部的递归调用。


示例:使用递归的阶乘

  1. class Factorial {
  2. static int factorial( int n ) {
  3. if (n != 0) // termination condition
  4. return n * factorial(n-1); // recursive call
  5. else
  6. return 1;
  7. }
  8. public static void main(String[] args) {
  9. int number = 4, result;
  10. result = factorial(number);
  11. System.out.println(number + " factorial = " + result);
  12. }
  13. }

输出

  1. 4 factorial = 24

在上面的示例中,我们有一个名为factorial()的方法。 从main()方法中调用factorial()number变量作为参数传递。

在这里,请注意以下声明:

  1. return n * factorial(n-1);

factorial()方法正在调用自身。 最初,factorial()内部的 n 值为 4。 在下一个递归调用期间,将 3 传递给factorial()方法。 该过程一直持续到n等于 0。

n等于 0 时,if语句返回false,因此返回 1。 最后,累积的结果将传递给main()方法。


递归程序的工作原理

下图将使您更好地了解如何使用递归执行阶乘程序。

Java 递归 - 图2

使用递归的阶乘程序


递归的优缺点

进行递归调用时,将在栈上分配新的变量存储位置。 随着每个递归调用的返回,旧的变量和参数将从栈中删除。 因此,递归通常使用更多的内存,并且通常很慢。

另一方面,递归解决方案要简单得多,并且花费更少的时间来编写,调试和维护。

推荐阅读:递归的优缺点是什么?