递归及其使用

递归及其使用

  • 1. 什么是递归?
  • 2. 递归解决什么问题?
  • 3. 递归的步骤
  • 4. 使用递归的注意事项
  • 5. 示例

1. 什么是递归?

递归是指在函数的定义中使用函数自身的过程。简单来说,递归是通过将大问题分解为更小的子问题来解决问题的一种方法。递归函数在执行时会反复调用自身,直到达到某个终止条件。

2. 递归解决什么问题?

递归的使用可以简化问题的解决过程,特别适用于那些具有递归结构或可分解为子问题的复杂问题。递归的主要优势在于它提供了一种自然而简洁的方式来解决这些问题。

3. 递归的步骤

  1. 定义递归函数的基本情况(终止条件):递归函数需要定义一个或多个基本情况,即当满足某个条件时,递归停止并返回结果。这是确保递归函数不会无限循环的关键。
  2. 将大问题分解为子问题:递归函数应该通过将大问题分解为一个或多个更小的子问题来解决。每个子问题都是原始问题的规模更小的版本。
  3. 在递归函数中调用自身:在解决子问题时,递归函数会调用自身来处理子问题。递归函数的调用应该是在满足递归终止条件之前的步骤。
  4. 组合子问题的结果:递归函数在处理完子问题后,需要将子问题的结果组合起来得到原始问题的解。

4. 使用递归的注意事项

  1. 确保递归终止条件的正确性:递归函数必须定义一个或多个终止条件,以避免无限递归。如果终止条件不正确或者缺失,递归函数可能会导致无限循环,最终耗尽计算资源。
  2. 确保每次递归调用都能向终止条件靠近:递归调用的参数或输入应该是可以缩小问题规模的,这样每次递归调用都能使问题向终止条件靠近。否则,递归函数可能会陷入无尽的递归循环。
  3. 注意递归的性能问题:递归函数可能会生成大量的函数调用和堆栈帧,消耗较多的内存和计算资源。在某些情况下,使用迭代等其他方法可能更高效。

5. 示例

  1. 合并两个有序链表

    public class MergeSortedLists {public ListNode mergeLists(ListNode l1, ListNode l2) {// 处理递归终止条件if (l1 == null) {return l2;}if (l2 == null) {return l1;}// 比较两个链表头节点的值,并选择较小的节点作为合并后链表的头节点if (l1.val < l2.val) {l1.next = mergeLists(l1.next, l2); // 递归调用mergeLists函数return l1;} else {l2.next = mergeLists(l1, l2.next); // 递归调用mergeLists函数return l2;}}
    }
    

    定义一个递归函数mergeLists,该函数接受两个有序链表的头节点作为参数,并返回合并后的链表的头节点。

    在函数内部,首先处理递归终止条件。如果其中一个链表为空,直接返回另一个链表的头节点。

    比较两个链表的头节点的值,将较小值的节点作为合并后链表的头节点,并将其next指针指向递归调用mergeLists函数的结果。

    递归调用mergeLists函数,传入较小节点的next指针和另一个链表的头节点作为参数。

    返回合并后的链表的头节点。

  2. 判断链表是否有环

    public class Solution {public boolean hasCycle(ListNode head) {// 判断链表是否为空或只有一个节点,不构成环if (head == null || head.next == null) {return false;}ListNode slow = head;  // 慢指针ListNode fast = head.next;  // 快指针return hasCycleRecursive(slow, fast);}private boolean hasCycleRecursive(ListNode slow, ListNode fast) {// 如果快指针到达链表末尾,说明没有环if (fast == null || fast.next == null) {return false;}// 如果快指针追上慢指针,说明存在环if (fast == slow || fast.next == slow) {return true;}// 继续移动指针return hasCycleRecursive(slow.next, fast.next.next);}
    }
    

    首先,在 hasCycle() 方法中检查链表是否为空或只有一个节点,这种情况下不会形成环,直接返回 false。

    然后,将慢指针 slow 初始化为链表头,快指针 fast 初始化为 slow 的下一个节点。

    接下来,调用 hasCycleRecursive() 方法进行递归判断。在递归方法中,首先判断快指针是否到达链表末尾,如果是,则链表不包含环,返回 false。然后,判断快指针是否追上慢指针或者快指针的下一个节点是否追上慢指针,如果是,则链表包含环,返回 true。最后,继续递归调用 hasCycleRecursive() 方法,将慢指针指向下一个节点,快指针指向下下个节点,继续进行判断。

    注意,这里使用了两个条件进行判断,即快指针是否追上慢指针,或者快指针的下一个节点是否追上慢指针。这是因为快指针每次移动两步,而慢指针每次移动一步,所以在形成环的情况下,两个指针可能会有一个节点的差距。

    最后,在主函数中调用 hasCycle() 方法,传入链表的头节点,即可判断链表是否存在环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[职场] 关于薪酬需要知道的两个知识点 #知识分享#知识分享

关于薪酬需要知道的两个知识点 薪酬问题是面试过程中比较核心的问题&#xff0c;也是每次面试必问的。如果你进入到面试的后一阶段&#xff0c;这类问题可以让面试官或企业判断求职者的要求是否符合企业的薪酬标准&#xff0c;并进一步判断求职者对自身价值的认可程度。关于薪…

数据结构之快速排序算法(快排)【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

【Java数据结构】详解Stack与Queue(三)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2. 队列&#xff08;Queue&#xff09; 2.1队列的概念 2.2队列的方法 2.3队列的使用 2.4循环队列 循环队列的介绍 循环队列图 如何区分循环队列是满还是空…

外挂知识库的基本知识与内容

外挂知识库 1.什么是rag&#xff1f; RAG,即LLM在回答问题或生成文本时&#xff0c;会先从大量文档中检索出相关的信息&#xff0c;然后基于这些信息生成回答或文本&#xff0c;从而提高预测质量。 2.外挂知识库的实现思路 只用几十万量级的数据对大模型进行微调并不能很好…

第五十六周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;应用于地表水总磷浓度预测的可解释CEEMDAN-FE-LSTM-Transformer混合模型 一、现有问题 二、提出方法 三、方法论 1、CEEMDAN&#xff08;带自适应噪声的完全包络经验模式分解&#xff09; 2、FE&#xff08;模糊熵 &#xff09…

Vue3【十】07使用ref创建基本类型的响应式数据以及ref和reactive区别

Vue3【十】07使用ref创建基本类型的响应式数据以及ref和reactive区别 ref 也可以创建对象类型的响应式数据&#xff0c;不过要使用.value ref 处理对象数据的时候&#xff0c;底层数据还是reactive格式的 reactive 重新分配一个新对象&#xff0c;会失去响应式可以使用Object.a…

自注意力机学习

自注意力机制的核心概念 1. Query, Key 和 Value Query&#xff08;查询向量&#xff09;&#xff1a;可以看作是你当前在关注的输入项。假设你正在阅读一段文字&#xff0c;这就像你当前在读的句子。 Key&#xff08;键向量&#xff09;&#xff1a;表示其他所有输入项的标识…

保姆级 | MySQL的安装配置教程(非常详细)

一、下载Mysql 官网步骤 MySQLhttps://www.mysql.com/进入官网首页 点击DOWNLOADS 点击MySQL Community (GPL) Downloads 点击 小页面直接进入 MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/点击“Download”下载最新版本&#xff0c;其他…

【吊打面试官系列】MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL 中 InnoDB 支持的四种事务隔离级别名称&#xff0c;以及逐级之间的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 中 InnoDB 支持的四种事务隔离级别名称&#xff0c;以及逐级之间的区别&#xf…

碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测

碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 &#xff1a; 碳素钢按化学成分&#xff08;即以含碳量&#xff09;可分为低碳钢、中…

机器学习笔记 - stable diffusion web-ui安装教程

一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…

问题:11单位内部人员对行政机关作出的行政处分不服,可申请行政复议. #其他#微信

问题&#xff1a;11单位内部人员对行政机关作出的行政处分不服,可申请行政复议. 参考答案如图所示

问题:脾梗塞时,下列情况最符合的是 #职场发展#知识分享#媒体

问题&#xff1a;脾梗塞时,下列情况最符合的是 A、脾肿大 B、脾区摩擦感 C、两者均有 D、两者均无 参考答案如图所示

uniapp视频组件层级太高,解决方法使用subNvue原生子体窗口

目录 前言 先看一下uniapp官网的原话&#xff1a; subNvue的一些参数介绍 subNvues使用方法&#xff1a; 绑定id 显示 subNvue 弹出层 subNvue.show() 参数信息 subNvue.hide() 参数信息 在使用subNvue 原生子体窗口 遇到的一些问题 前言 nvue 兼容性 以及使用方式 控…

基于 中间件 的 数据交换平台 的实现

一、介绍 A. 背景和目的 随着云计算、大数据和物联网等技术的快速发展&#xff0c;企业面临着越来越多的数据交换和集成需求。不同系统之间的数据交换变得越来越复杂&#xff0c;而且数据量也越来越大&#xff0c;这对传统的数据交换方式提出了更高的要求。 中间件作为一种能…

把ROS程序作为桌面图标双击启动

1 写launch文件 把ROS程序写成一个launch文件&#xff0c;例如 powerline_with_rviz.launch <launch><!-- Load camera parameters --><rosparam file"$(find choose_powerline)/config/camera_params.yaml" command"load"/><!-- …

深入理解并应用KTT求解约束性极值问题

KT 很简单&#xff0c;口诀记心端&#xff0c;等式求最优&#xff0c;不等式验证——小飞打油 以后每期尝试编一句口诀&#xff0c;帮助大家记忆&#xff0c;可以是打油诗&#xff0c;也可以是类似“奇变偶不变&#xff0c;符号看象限”的口诀&#xff0c;如果编的不好&#xf…

2024年6月7日第十五周下午学习英语六级大纲

下午学习英语六级大纲的内容可以归纳为以下几个主要方面&#xff1a; 一、考试概述 六级考试的对象&#xff1a;修完大学英语相应阶段课程的在校大学生。考试目的&#xff1a;参照《大学英语教学指南》设定的教学目标&#xff0c;对我国大学生英语综合运用能力进行科学测量&a…

Docker 常用命令以及镜像选择

目录 1.Docker基本组成 2.镜像选择 2.1、镜像推荐选择方案 2.2版本选择 3.Docker 命令 3.1镜像管理 拉取镜像&#xff1a; 列出镜像&#xff1a; 删除镜像&#xff1a; 构建镜像&#xff1a; 3.2容器管理 运行容器 列出运行中的容器和所有容器 停止容器 启动重启…

【Qt】QPushButton 与 QAction 的区别

1. QPushButton QPushButton 是一个界面控件&#xff0c;能显示到界面上的。QPushButton 是 QWidget的一个子类&#xff0c;是一个表示按钮的界面控件。它用于在GUI中提供一个标准的按钮&#xff0c;用户可以点击它来触发一个即时的动作或命令。按钮可以显示文本、图标或两者都…