递归是一种解决问题的方法,其中一个函数调用自身以解决较小的实例,直到达到基本情况(停止条件),然后开始返回结果。递归可以让我们更容易地解决复杂的问题,因为它允许我们将问题分解成更小的子问题。
在递归中,通常有两个关键要素:
public class RecursionExample {
public static int factorial(int n) {
// 停止条件:当n等于0或1时,阶乘为1。
if (n == 0 || n == 1) {
return 1;
} else {
// 递归调用:计算n * (n-1)的阶乘。
return n * factorial(n - 1);
}
}
public static void main(String[] args) {
int n = 5;
int result = factorial(n);
System.out.println("Factorial of " + n + " is " + result);
// Factorial of 5 is 120
}
}
public class RecursionTest {
public static void main(String[] args) {
RecursionTest test = new RecursionTest();
// test.method1(); // 内存溢出
System.out.println(test.getSum(100));
}
/**
* 计算1-100之间所有自然数的和
*/
public int getSum(int n) {
if (n == 1) {
return 1;
} else {
return n + getSum(n - 1);
}
}
public void method1() {
System.out.println("method1() begin");
method1();
System.out.println("method1() end");
}
}
当一个递归函数被调用时,它将问题分解成较小的子问题,然后继续调用自身来解决这些子问题。每个子问题都会再次分解,直到达到停止条件。然后,递归函数开始返回结果,将结果合并以解决原始问题。
在递归调用中,每个函数调用都有自己的局部变量和执行上下文,这些信息在递归的不同层次之间传递。
递归在许多计算机科学和编程问题中都有广泛的应用。以下是一些常见的递归应用场景: