Java 递归

在 Java 中,一个调用自身的方法被称为递归方法。而这个过程被称为递归。

一个物理世界的例子就是放置两面平行相对的镜子。它们之间的任何物体都会被递归地反射。


递归如何工作?

A function is calling itself
Java 递归的工作原理

在上面的例子中,我们从 `main` 方法(普通方法调用)内部调用了 `recurse()` 方法。并且,在 `recurse()` 方法内部,我们再次调用了同一个 `recurse` 方法。这就是递归调用。

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

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


示例:使用递归计算数字的阶乘

class Factorial {

    static int factorial( int n ) {
        if (n != 0)  // termination condition
            return n * factorial(n-1); // recursive call
        else
            return 1;
    }

    public static void main(String[] args) {
        int number = 4, result;
        result = factorial(number);
        System.out.println(number + " factorial = " + result);
    }
}

输出:

4 factorial = 24

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

这里,请注意这条语句:

return n * factorial(n-1);

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

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


阶乘程序的工作原理

下图将更清楚地说明使用递归如何执行阶乘程序。

Finding the factorial of a number using recursion
使用递归的阶乘程序

递归的优点和缺点

当进行递归调用时,变量的新存储位置会被分配到堆栈上。当每个递归调用返回时,旧的变量和参数会从堆栈中移除。因此,递归通常使用更多的内存,并且通常速度较慢。

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

在我们结束之前,让我们来检验一下您对 Java 递归的掌握情况!您能解决以下挑战吗?

挑战

编写一个函数来计算一个数字的阶乘。

  • 非负整数 **n** 的阶乘是小于或等于 **n** 的所有正整数的乘积。
  • 返回输入数字 num 的阶乘。
  • 例如,如果 `num = 5`,输出应为 **120**。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战