递归、搜索与回溯算法:递归

递归
在解决⼀个规模为n的问题时,如果满⾜以下条件,我们可以使⽤递归来解决:
a. 问题可以被划分为规模更⼩的⼦问题,并且这些⼦问题具有与原问题相同的解决⽅法。
b. 当我们知道规模更⼩的⼦问题(规模为 n - 1)的解时,我们可以直接计算出规模为 n 的问题
的解。
c. 存在⼀种简单情况,或者说当问题的规模⾜够⼩时,我们可以直接求解问题。
⼀般的递归求解过程如下:
a. 验证是否满⾜简单情况。
b. 假设较⼩规模的问题已经解决,解决当前问题。
上述步骤可以通过数学归纳法来证明。

例题一

解法(递归):
算法思路:
这是⼀道递归⽅法的经典题⽬,我们可以先从最简单的情况考虑:
假设 n = 1,只有⼀个盘⼦,很简单,直接把它从 A 中拿出来,移到 C 上;
如果 n = 2 呢?这时候我们就要借助 B 了,因为⼩盘⼦必须时刻都在⼤盘⼦上⾯,共需要 3 步(为了⽅便叙述,记 A 中的盘⼦从上到下为 1 号,2 号):
a. 1 号盘⼦放到 B 上;
b. 2 号盘⼦放到 C 上;
c. 1 号盘⼦放到 C 上。
⾄此,C 中的盘⼦从上到下为 1 号, 2 号。
如果 n > 2 呢?这是我们需要⽤到 n = 2 时的策略,将 A 上⾯的两个盘⼦挪到 B 上,再将最⼤的盘⼦挪到 C 上,最后将 B 上的⼩盘⼦挪到 C 上就完成了所有步骤。例如 n = 3 时如下图:
因为 A 中最后处理的是最⼤的盘⼦,所以在移动过程中不存在⼤盘⼦在⼩盘⼦上⾯的情况。
则本题可以被解释为:
1. 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘⼦移动到C柱上。
2. 规模为 n 的问题可以被拆分为规模为 n-1 的⼦问题:
a. 将 A 柱上的上⾯ n-1 个盘⼦移动到B柱上。
b. 将 A 柱上的最⼤盘⼦移动到 C 柱上,然后将 B 柱上的 n-1 个盘⼦移动到C柱上。
3. 当问题的规模变为 n=1 时,即只有⼀个盘⼦时,我们可以直接将其从 A 柱移动到 C 柱。
需要注意的是,步骤 2.b 考虑的是总体问题中的 ⼦问题b 情况。在处理⼦问题的⼦问题b 时,我们应该将 A 柱中的最上⾯的盘⼦移动到 C 柱,然后再将 B 柱上的盘⼦移动到 C 柱。在处理总体问题的⼦问题b 时,A 柱中的最⼤盘⼦仍然是最上⾯的盘⼦,因此这种做法是通⽤的。
算法流程:
递归函数设计:void hanotaa(vector<int>& A, vector<int>& B, vector<int>& C, int n)
1. 返回值:⽆;
2. 参数:三个柱⼦上的盘⼦,当前需要处理的盘⼦个数(当前问题规模)。
3. 函数作⽤:将 A 中的上⾯ n 个盘⼦挪到 C 中。
递归函数流程:
1. 当前问题规模为 n=1 时,直接将 A 中的最上⾯盘⼦挪到 C 中并返回;
2. 递归将 A 中最上⾯的 n-1 个盘⼦挪到 B 中;
3. 将 A 中最上⾯的⼀个盘⼦挪到 C 中;
4. 将 B 中上⾯ n-1 个盘⼦挪到 C 中。

例题二

解法(递归):
算法思路:
1. 递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;
2. 函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理;
3. 递归出⼝:当某⼀个链表为空的时候,返回另外⼀个链表。
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!

例题三

解法(递归):
算法思路:
1. 递归函数的含义:交给你⼀个链表的头指针,你帮我逆序之后,返回逆序后的头结点;
2. 函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后⾯即可;
3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤逆序,直接返回。
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!

例题四

解法(递归):
算法思路:
1. 递归函数的含义:交给你⼀个链表,将这个链表两两交换⼀下,然后返回交换后的头结点;
2. 函数体:先去处理⼀下第⼆个结点往后的链表,然后再把当前的两个结点交换⼀下,连接上后⾯处理后的链表;
3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤交换,直接返回。
注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!

例题五

解法(递归 - 快速幂):
算法思路:
1. 递归函数的含义:求出 x 的 n 次⽅是多少,然后返回;
2. 函数体:先求出 x 的 n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x n 次⽅是多少;
3. 递归出⼝:当 n 为 0 的时候,返回 1 即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL事务、主从、分库分表常见面试题

文章目录 1.事务的特性2.并发事务问题&#xff0c;如何解决&#xff0c;默认隔离级别3.undo log和redo log的区别4.事务中的隔离性是如何保证的&#xff08;解释一下MVCC&#xff09;5.主从同步原理6.分库分表 1.事务的特性 2.并发事务问题&#xff0c;如何解决&#xff0c;默认…

Windows部署ChatGLM3步骤

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部署步骤 1、新建pytho…

无缝集成:使用Spring Boot和Vue实现头像上传与回显功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

乡村振兴多元共治,共绘乡村新蓝图:政府引领、企业助力、村民参与

乡村振兴是一项复杂而艰巨的任务&#xff0c;需要从多个角度进行考虑。以下是从不同身份出发对乡村振兴建设的思考&#xff1a; 1、政府领导的角度&#xff1a; 政府是乡村振兴的主要推动者和组织者。在制定和实施乡村振兴战略时&#xff0c;政府需要注重规划引领&#xff0c;科…

【webrtc】源码下载与编译

目录 下载 下依赖 内存需求 &#xff01;&#xff01; 参考文章 &#xff1a; 下载 (1) windows ,centos上都会报错 &#xff08;2&#xff09; ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码&#xff0c;且额外加了a…

群晖虚拟机搭建Synology Drive并实现Obsidian笔记异地多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

目标检测——瓷砖瑕疵检测数据集

一、重要性及意义 瓷砖瑕疵检测在瓷砖制造和质量控制过程中具有极其重要的地位&#xff0c;其重要性和意义主要体现在以下几个方面&#xff1a; 首先&#xff0c;瓷砖瑕疵检测是确保产品质量的关键环节。瓷砖作为家居装修中不可或缺的材料&#xff0c;其表面质量直接影响到装…

关于ABP 新增表,dbfirst模式

下面的代码是基于abp生成的项目&#xff0c;项目名&#xff1a;Store 1.在Domain结尾的项目中通过EF工具生成数据实体&#xff1a; Scaffold-DbContext Data Source服务器IP;Initial Catalog数据库;User Idsa;Password密码;EncryptFalse; Microsoft.EntityFrameworkCore.SqlS…

【React】React Hooks

useState useState 向组件中添加状态变量 状态是只读的&#xff0c;不可以直接修改 对于对象类型的状态变量&#xff0c;应该传递一个新的对象来更改 需要对象展开&#xff0c;并重新赋值&#xff0c;进行增加或者修改。 如果需要删除&#xff0c;则使用 filter。 import { …

Android MTK 屏下指纹的调试过程记录

Demo链接 -----> https://download.csdn.net/download/u011694328/89118346 一些品牌手机都有了屏下指纹的功能&#xff0c;还算是个比较新颖的功能&#xff0c;最近有项目需要使用屏下指纹&#xff0c; 使用的是汇顶&#xff08;Goodix&#xff09;的指纹方案&#xff0c…

学习笔记之——3DGS-SLAM系列代码解读

最近对一系列基于3D Gaussian Splatting&#xff08;3DGS&#xff09;SLAM的工作的源码进行了测试与解读。为此写下本博客mark一下所有的源码解读以及对应的代码配置与测试记录~ 其中工作1~5的原理解读见博客&#xff1a; 学习笔记之——3D Gaussian Splatting及其在SLAM与自动…

jupyter python paramiko 网络系统运维

概述 通过使用jupyter进行网络运维的相关测试 设备为H3C 联通性测试 import paramiko import time import getpass import re import os import datetimeusername "*****" password "*****" ip "10.32.**.**"ssh_client paramiko.SSHCli…

【JSON2WEB】14 基于Amis的CRUD开发30分钟速成

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

docker安装Jenkins,CI/CD,代码发布,环境维护,测试神器

文章目录 前言创建文件夹设置权限docker-compose.yaml文件安装启动docker 查看网站获取密码方式1获取密码方式2 初始化jenkins 前言 Jenkins 是一个开源的持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;工具&#xff0c;用于自动化构建、测试和部署…

2024最新高频渗透测试面试题,啃完直通大厂

2024的金三银四即将结束&#xff0c;不知道大家有没有找到心仪的工作呀&#xff0c;今天给大家整理了100道渗透测试面试题&#xff0c;都是今年被问到的高频题目 第一套渗透面试题 什么是渗透测试&#xff1f;它的目的是什么&#xff1f;渗透测试的五个阶段是什么&#xff1f;…

免重装系统,直接把家庭版升级为专业版!

前言 前段时间有小伙伴找小白重装系统。一般在重装系统之前&#xff0c;我都会问对方&#xff1a;为什么要重装系统&#xff1f; 结果她和我说&#xff1a;家庭版不好用&#xff0c;想要重装成专业版。感觉专业版更好一些&#xff0c;听起来好像也更厉害一些。 嗯……这个理由…

npm i -g nodemon 遇到的下载卡住及运行权限问题解决记录

一、下载nodemon原因 nodemon作用&#xff1a;用node环境运行js文件时可以实时刷新运行出结果 (即修改js代码后不需再手动重新运行js文件) 二、下载卡住 reify:semver:timing reifyNode:node_modules/nodemon Completed 卡住位置&#xff1a;reify:semver: timing reifyNode…

C#学习笔记9:winform上位机与西门子PLC网口通信_上篇

今日继续我的C#学习笔记&#xff0c;今日开始学习打开使用千兆网口来进行与西门子PLC的通信&#xff1a; 文章提供整体代码、解释、测试效果截图、整体测试工程下载&#xff1a; 主要包含的知识有&#xff1a;下载NuGet程序包、西门子PLC及通信协议、搭建虚拟的S7通信仿真环境…

连接两部VR头显的type-c DP分配器方案,可以给主机设备PD反向供电与两部VR同时供电。

随着type-c的发展&#xff0c;目前越来越多的设备都在使用type-c作为连接的接口&#xff0c; 不仅是笔记本与手机在使用现在的游戏主机如&#xff08;任天堂&#xff0c;steam&#xff0c;&#xff09;或者是VR的一体机或者是VR头显也都在使用type-c作为连接接口。 type-c接口…

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…