Java 使用递归
递归是一种编程实践,允许一个方法根据需要反复调用自身。调用自身的方法被称为递归方法。在计算阶乘和斐波那契数列时,可以找到递归的应用。递归将多行复杂代码减少到相对较少的行数,使代码更简单易懂。
在本文中,我们将学习递归并应用其概念来解决一些问题。此外,我们还将讨论使用递归时最常见的错误。
递归
运行程序的每个接口、类、对象、变量和方法都存储在计算机内存的不同区域中。引用变量、方法和类的名称存储在堆栈中,它们的值存储在堆中。同样,递归方法在每个方法调用时在堆栈内存中占用空间,并在方法执行停止之前保持。执行完成后,它们从堆栈中移除,程序的流程恢复到启动方法main()。
在使用递归时,请确保提供一个基本情况,强制递归方法返回结果或终止方法调用。
示例
在以下示例中,我们将用一个简单的乘法运算演示递归的用法。首先,我们创建一个带有整数类型参数的带参数方法。在该方法中,我们使用if-else块定义一个基本情况。该方法将在else块中调用自身5次,直到if块为真。
public class Overflw {
public static void methodA(int n1) {
if(n1 == 5) {
// base condition to terminate the recursive method
int n2 = 5;
int mult = n1 * n2;
System.out.println("Value of n1 and n2 multiplication is: " + mult);
} else {
methodA(n1 + 1);
// calling the method
}
}
public static void main(String []args) {
int n1 = 0;
methodA(n1);
// first method call
}
}
输出
Value of n1 and n2 multiplication is: 25
在Java中的StackOverflowError错误
每当递归过程开始时,它会自动以固定的栈大小进行定义。在每个方法调用期间,在调用堆栈上创建一个调用帧,并在方法调用结束时继续。当计算机内存的栈空间中没有足够的空间来创建新的栈帧时,我们就会遇到 StackOverflowError 错误。
语法
import java.lang.StackOverflowError;
这个类位于“java.lang”包中。我们不一定需要导入这个包。通常情况下,这个包中的类是自动可用的,无需导入到我们的程序中。然而,也有一些例外情况。
示例
下面的示例说明了StackOverflowError。
import java.lang.StackOverflowError;
public class Overflw {
public static void methodA(int n1) {
n1++;
methodB(n1);
}
public static void methodB(int n1) {
n1++;
methodA(n1);
}
public static void main(String []args) {
int n1 = 0;
methodA(n1);
}
}
输出
Exception in thread "main" java.lang.StackOverflowError
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
at Overflw.methodA(Overflw.java:5)
at Overflw.methodB(Overflw.java:9)
由于上面的输出结果可见,我们得到了StackOverflowError。我们在代码中所做的是创建了两个参数化的用户定义方法,即“methodA”和“methodB”。在主方法中,我们声明并初始化了一个整数变量“n1”为0,并调用了“methodA”,同时还传入了一个参数“n1”。现在,“methodA”以“n1”的增加值调用了“methodB”。再次,“methodB”调用了“methodA”,这个过程不断重复。因此,在某个点上,为这个程序创建的堆栈大小被耗尽,导致以下错误。
下面是我们可以采取的措施来处理StackOverflowError: \
- 仔细检查重复出现的那些行,并尝试找出它们未终止的原因。
- 默认的堆栈大小可能是512KB或1MB,这取决于安装的Java虚拟机,但我们可以手动增加堆栈的大小来避免此错误。然而,这种技术很少被使用。
结论
递归方法比迭代方法(如for循环和while循环)略慢。如果基本情况无法处理递归,则会导致堆栈溢出,具体说就是StackOverflowError。在本文中,我们学习了递归以及StackOverflowError。