Java 中不同类型的递归2024年9月10日 | 阅读 6 分钟 一个函数或方法调用自身的进程称为递归。递归是 Java 中的一个重要主题。在本教程中,我们将讨论 Java 中不同类型的递归。 递归类型递归主要有两种类型 1) 直接递归直接递归意味着方法直接调用自身。直接递归可以进一步分为五个部分 a) 尾递归: 在尾递归中,函数调用自身,而负责递归的语句是方法的最后一条语句。换句话说,在递归语句之后,不应该有任何语句。如果递归函数调用自身,并且该递归调用是函数中的最后一条语句,那么它被称为尾递归。函数在调用时必须执行或处理任何操作,而在返回时则不执行任何操作。 文件名: TailRecursion.java 输出 The value is 4 The value is 3 The value is 2 The value is 1 复杂度分析: 程序的时间复杂度为 O(n)。这是因为负责递归的语句运行了 n 次。程序的空间复杂度为 O(n)。 文件名: TailRecursion1.java 输出 The value is 4 The value is 3 The value is 2 The value is 1 复杂度分析: 程序的时间复杂度为 O(n)。这是因为循环运行了 n 次。程序的空间复杂度为 O(1)。 从这两段程序可以看出,迭代(使用循环)的性能优于递归,因为迭代占用的空间更少。让我们探讨一下原因。 在循环的情况下,当函数“(void functn(int y))”执行时,在堆栈中只维护一个激活记录(变量“y”的激活记录)。因此,在堆栈中只创建了一个单位的内存,使得程序的空间复杂度为 O(1)。相比之下,在递归的情况下,每次函数调用自身时都会创建一个单独的激活记录,使得程序的空间复杂度为 O(n),前提是递归持续 n 次。 b) 头递归: 在头递归中,负责递归的语句是函数的第一条语句。换句话说,在负责递归的语句之前不应有任何操作语句。 文件名: HeadRecursion.java 输出 The value is 1 The value is 2 The value is 3 The value is 4 复杂度分析: 程序的时间复杂度为 O(n),空间复杂度也为 O(n)。 c) 线性递归: 当一个函数只调用自身一次时,就称为线性递归。观察其伪代码。 在头递归和尾递归中讨论的程序也是线性递归的示例。 d) 树递归: 当一个函数调用自身多次时,就称为树递归。观察以下示例。 文件名: TreeRecursion.java 输出 The value is 4 The value is 3 The value is 2 The value is 1 The value is 1 The value is 2 The value is 1 The value is 1 The value is 3 The value is 2 The value is 1 The value is 1 The value is 2 The value is 1 The value is 1 复杂度分析: 程序的时间复杂度为 O(2n),空间复杂度也为 O(2n)。时间和空间复杂度呈指数级增长,因为一次递归调用会导致两次单独的递归调用。 e) 嵌套递归: 在这种递归中,一个函数会调用自身,而负责递归的语句是嵌套的,这意味着在递归调用的参数中有一个递归调用。换句话说,“递归内部有递归”。以下示例将使概念更清晰。 文件名: NestedRecursion.java 输出 The value is 4 The value is 3 The value is 2 The value is 1 复杂度分析: 程序的时间复杂度为 O(n),空间复杂度也为 O(n)。 2) 间接递归假设有一个名为 funA() 的函数,该函数调用另一个名为 funB() 的函数,该函数调用另一个名为 funC() 的函数,而 funC() 函数调用 funA() 函数,则此类型的递归称为间接递归。我们看到有一系列函数 funA() 调用函数 funB(),函数 funB() 调用函数 funC(),函数 funC() 调用函数 funA()。让我们看看它的实现。 文件名: IndirectRecursion.java 输出 In function A, the value is 10 In function B, the value is 9 In function C, the value is 8 In function A, the value is 7 In function B, the value is 6 In function C, the value is 5 In function A, the value is 4 In function B, the value is 3 In function C, the value is 2 In function A, the value is 1 复杂度分析: 程序的时间复杂度为 O(n),空间复杂度也为 O(n)。 下一个主题使用示例在 Java 中初始化静态映射 |
? Java 以其在面向对象编程中构建和操作对象的能力而闻名。对象是类的实例,在 Java 编程语言中,实例是基本。在这篇文章中,我们将探讨 Java 实例是什么,以及类和对象如何...
阅读 4 分钟
在本节中,我们将学习什么是跳跃数,并创建 Java 程序来检查给定的数字是否为跳跃数。跳跃数程序经常在 Java 编码测试和学术中被问到。跳跃数 一个数字 N 被称为跳跃数...
7 分钟阅读
在本节中,我们将创建 Java 程序,将一个数字的各位相加,直到该数字变为个位数。该问题也称为数字根问题。示例假设 76345 是一个数字,我们需要找到它的各位数字之和,直到它变成...
阅读 3 分钟
? 编程是一种锻炼或练习,可以增强我们的逻辑思维并提高解决问题的能力。它教我们如何借助计算机程序或软件来完成任务。因此,简单来说,编程就是实现解决方案的任务...
阅读 8 分钟
给定一个字符串“str”,我们的任务是通过重新排列给定文本中的字符来创建一个字典序最小的回文串。如果没有这样的字符串,则将返回消息“不存在这样的回文串”。示例 1:输入:字符串 str = "madam" 输出:字典序...
阅读 4 分钟
JSON 代表 JavaScript 对象表示法,它是一种轻量级的数据存储和传输格式。它以键值对的形式存储数据。大多数应用程序使用此格式在服务器和网页之间传输数据,反之亦然。但是,...
阅读 6 分钟
在 Java 中,方法链是连续调用方法的链。它与构造函数链相同,但唯一的区别是方法和构造函数。在本节中,我们将讨论 Java 中的方法链。方法链是常见的...
阅读 2 分钟
问题陈述给定一个数字 n。任务是检查数字是否遵循给定的顺序(严格递增、递减或其他模式)。示例 1:输入:1234 输出:是 说明:数字严格递增,因此数字遵循所需模式。示例 2:输入:4321 输出:是 说明:数字是...
阅读 8 分钟
XOR按位运算符,用符号“^”表示,是Java中的二元运算符,它在两个操作数之间执行按位XOR运算。XOR运算返回一个值,其中结果中的每个位仅当精确地...
阅读 3 分钟
在 Java 编程世界中,图形用户界面 (GUI) 在创建交互式应用程序方面发挥着至关重要的作用。在开发基于 GUI 的应用程序时,有效处理关闭操作至关重要。在 Java 中,“设置默认关闭操作”是一个关键方法,用于控制行为...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India