在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()
的方法。从main()
方法调用factorial()
。用传递的数字变量作为参数。
在这里,请注意以下声明:
return n * factorial(n-1);
factorial()
方法正在调用自身。最初,n的值在factorial()
内部为4。在下一个递归调用期间,将3传递给factorial()
方法。此过程一直持续到n等于0。
当n等于0时, if
语句返回false,因此返回1。最后,将累积的结果传递给main()
方法。
析因程序的工作
下图将使您更好地了解如何使用递归执行阶乘程序。
递归的优缺点
进行递归调用时,将在堆栈上分配新的变量存储位置。随着每个递归调用的返回,旧的变量和参数将从堆栈中删除。因此,递归通常使用更多的内存,并且通常很慢。
另一方面,递归解决方案要简单得多,并且花费更少的时间来编写,调试和维护。
推荐读物:递归的优缺点是什么?