Java 使用递归

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。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程