Java 递归
Java 递归
递归(Recursion)是使函数调用其本身的技术。这种技术提供了一种将复杂问题分解为更容易解决的简单问题的方法。
递归可能有点难以理解。弄清楚它是如何工作的最好方法是试验它。
递归实例
将两个数字相加很容易,但将一系列数字相加则更为复杂。
在下例中,递归用于将一系列数字相加,方法是将其分解为两个数字相加的简单任务:
实例
使用递归将所有数字相加到 10。
public class Main {
public static void main(String[] args) {
int result = sum(10);
System.out.println(result);
}
public static int sum(int k) {
if (k > 0) {
return k + sum(k - 1);
} else {
return 0;
}
}
}
例子解释
当调用 sum() 函数时,它将参数 k 与所有小于 k 的数字的和相加并返回结果。当 k 变为 0 时,函数只返回 0。运行时,程序遵循以下步骤:
10 + sum(9) 10 + ( 9 + sum(8) ) 10 + ( 9 + ( 8 + sum(7) ) ) ... 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0) 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
由于当 k 为 0 时函数不调用自身,程序会停在那里并返回结果。
停止条件
正如循环会遇到无限循环的问题一样,递归函数也会遇到无限递归的问题。无限递归是指函数永远不会停止调用自身。每个递归函数都应该有一个暂停条件,即函数停止调用自身的条件。在前面的例子中,停止条件是参数 k 变为 0 时。
查看各种不同的实例有助于更好地理解此概念。在本例中,该函数在开始和结束之间添加一系列数字。这个递归函数的停止条件是当 end 不大于 start 时:
实例
使用递归将 5 到 10 之间的所有数字相加。
public class Main {
public static void main(String[] args) {
int result = sum(5, 10);
System.out.println(result);
}
public static int sum(int start, int end) {
if (end > start) {
return end + sum(start, end - 1);
} else {
return end;
}
}
}
注意:开发者在使用递归时应格外小心,因为很容易写出永不终止的函数,或者过度消耗内存或处理器资源的函数。然而,当递归使用得当时,它可以成为编程中一种非常高效且数学上优雅的方法。