C++递归算法回溯思想

news2025/2/24 9:15:28

文章目录

  • 一、最简单的递归问题(调用函数后无其他代码、不涉及复杂的回溯思想)
  • 二、递归函数中的return不是结束整个递归函数哦
  • 三、递归(涉及回溯)举例
    • 学生的年龄问题(递归的执行过程)
  • 四、涉及较复杂的回溯思想
    • 楼梯问题

一、最简单的递归问题(调用函数后无其他代码、不涉及复杂的回溯思想)

递归算法

  1. 递归算法:就是一种函数直接或者间接地调用自身的算法。
  2. 递归算法包括两种情况:函数自己调用自己;两个函数之间互相调用。
    注:(1)有递归边界;(2)每一步执行动作一样;(3)每调用一次规模缩小;(4)结果通过一步步结果层层退出。

在这里插入图片描述

#include<iostream>
using namespace std;
int a=0;
void story();
int main(){
	story();
	return 0;
}
void story(){
	cout<<"小和尚";
	a++;
	if(a<3) story();
	else cout<<"故事讲完了";
}
//答案是:小和尚小和尚小和尚故事讲完了

二、递归函数中的return不是结束整个递归函数哦

在这里插入图片描述
1、递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的。

2、递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就调用下一层,因此,当达到递归终止条件时,首先return的是最底层调用的函数,return之后,继续执行上一层调用该函数之后的代码,此时我们看到的是上一层的情况,当上一层剩余的代码执行完之后,表示上一层的函数也结束,此时再返回上上一层,执行递归代码之后的代码,如此往复循环,直到返回到最上层,结束整个递归过程。

3、需要注意的是,上一层执行递归之后的代码的时候,会调用下一层返回的值,也可以理解为在执行上一层代码的时候会调用下一层的实现过程,直到下一层执行完返回一个数值,然后再加上上一层的数值,就构成了上一层return的东西,如此往复。

多说无用,来实战吧!
在这里插入图片描述

三、递归(涉及回溯)举例

学生的年龄问题(递归的执行过程)

 问题描述:有 5 个学生坐在一起,问第 5 个学生多少岁?他说比第 4 个学生大 2岁,问第 4 个学生岁数,他说比第 3 个学生大 2 岁,问第 3 个学生,又说比第 2个学生大 2 岁,问第 2 个学生,说比第 1 个学生大 2 岁,最后问第 1 个学生,他说是 10 岁,请问第 5 个学生多大。
先来个代码

#include<iostream>
using namespace std;
//函数的定义,int值函数的返回值类型为int数据
int age(int n){
	int c;
	if(n==1){
		c = 10;
	}else{
		c = age(n-1) + 2;
	}
	//必须要用rteurn,因为第8行需要用到它的返回值
 	return c;
}
int main(){
	cout<<age(5);
	return 0;
}
//答案是:18

n本身的值没有变(只是把n-1作为实际参数传进去了),但是它作为实际参数传进来age函数里之后n其实变了

递归:c其实就相当于age(n),因为递归函数的返回值是return c;

n=5 c=age(4)+2
n=4 c=age(3)+2
n=3 c=age(2)+2
n=2 c=age(1)+2
n=1 c=10

回溯
n=1时age(1)=10
n=2时age(2)=12
n=3时age(3)=14
n=4时age(4)=16
n=5时age(5)=18

四、涉及较复杂的回溯思想

楼梯问题

1、问题描述:小明上楼梯,一步可以迈 1 个台阶、2 个台阶或者 3 个台阶,现共有 n(1≤n≤30)个台阶,请编程计算他所有可能的走法。
输入样例:4
输出样例:
1 1 1 1
1 1 2
1 2 1
1 3
2 1 1
2 2
3 1

#include<iostream>
using namespace std;
int a[1000];//定义这一步走多少台阶
int index;//定义第几步
void output(){
	for(int i=0;i<index;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
//定义step函数
void step(int n){
	//设置结束的条件,表示可以形成一种走法
	if(n==0){
		output();
		return;
	}
	a[index++]=1;
	step(n-1);
	index--;
	if(n>1){
		a[index++]=2;
		step(n-2);
		index--;
	}
	if(n>2){
		a[index++]=3;
		step(n-3);
		index--;
	}
}
int main(){
	int n;//n表示总台阶数
	cin>>n;
	step(n);//step函数返回n阶台阶的总走法
	return 0;
}

递归:
n=4 a[0]=1 index=1
n=3 a[1]=1 index=2
n=2 a[2]=1 index=3
n=1 a[3]=1 index=4
n=0 output()函数输出1 1 1 1,return之后结束回到上一次递归、且此时
n=1 index=3 不符合两个if语句,又回到上一层递归
n=2 index=2 符合第一个if(n>1),则a(2)=2,index=3 ,n=0,则output()函数输出1 1 2
return之后回到上一次递归,也就是n=2,index=2,不符合if(n>2)回到上一次递归也就是n=3,index=1
符合if(n>1) 则a(1)=2,index=2,step(1),a(2)=1,index=3,step(0),调用output函数输出1 2 1

以此类推~~就不全部举例啦
在这里插入图片描述
其实吧,这个题要是不用编程思想解决的话

可以很简单

比如,用数学思维、找规律哈哈哈
n=1时只有1种走法
n=2时只有2种走法
n=3时只有4种走法
n=1时只有7种走法
变形版斐波那契数列哈哈
f(n)=f(n-1)+f(n-2)+f(n-3)

一句代码完美解决
在这里插入图片描述

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

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

相关文章

Zookeeper (更新中)

目录Zookeeper 概述Zookeeper 的特点Zookeeper 的应用场景Zookeeper的数据结构ZNode数据类型ZNode里面存储的信息Zookeeper的选举机制&#xff08;重要&#xff09;Zookeeper第一次启动选举机制Zookeeper非第一次启动选举机制Zookeeper 底层如何按照请求的先后顺序来处理的Zook…

计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing

编辑主要关心&#xff1a; &#xff08;1&#xff09;文章内容是否具有足够的创新性&#xff1f; &#xff08;2&#xff09;文章主题是否符合期刊的受众读者&#xff1f; &#xff08;3&#xff09;文章方法学是否合理&#xff0c;数据处理是否充分&#xff1f; &#xff08;…

3|射频识别技术|第五讲:数据通信和编码技术|第九章:编码与调制|重点理解掌握传输介质中的有线传输介质

计算机网络部分&#xff1a;https://blog.csdn.net/m0_57656758/article/details/128943949传输介质分为有线传输介质和无线传输介质两大类&#xff1b;有线传输介质通常包含双绞线、同轴电缆和光导纤维&#xff1b;无线传输介质包含微波、红外线等。传输介质的选择和连接是网络…

02Hadoop环境搭建

版本 hadoop-3.1.3.tar.gz解压安装文件到/opt/module下面 [sarahhadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/将Hadoop添加到环境变量 &#xff08;1&#xff09;获取Hadoop安装路径 [sarahhadoop102 hadoop-3.1.3]$ pwd /opt/module/hadoop-3.1.3&…

Toolformer: Language Models Can Teach Themselves to Use Tools

展示了LM可以通过简单的API教自己使用外部工具&#xff0c;并实现两个世界的最佳效果。我们介绍了Toolformer&#xff0c;这是一个经过训练的模型&#xff0c;可以决定调用哪些API&#xff0c;何时调用&#xff0c;传递哪些参数&#xff0c;以及如何将结果最好地纳入未来的标记…

Spring Cloud Alibaba环境搭建

环境依赖 SpringCloud Alibaba 依赖 Java环境来运行。还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 1. 64 bit JDK 1.8&#xff1b;下载& 配置。 1.8.0_131 2. Maven 3.2.x&#xff1b;下载& 配置搭建微服务 1.建立微服务项目 1.idea通过…

yolov5编译安卓APP:解决图像上全是检测框

yolov5编译安卓APP&#xff1a;解决图像上全是检测框前言一、第一个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法二、第二个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法三、其他1.APK打包2.修改APP图标与名字前言 YOLOv5编译安卓A…

【精选论文 | Capon算法与MUSIC算法性能的比较与分析】

本文编辑&#xff1a;调皮哥的小助理 【正文】 首先说结论&#xff1a; 当信噪比&#xff08;SNR&#xff09;足够大时&#xff0c;Capon算法和MUSIC算法的空间谱非常相似&#xff0c;因此在SNR比较大时它们的性能几乎一样&#xff0c;当不同信号源的入射角度比较接近时&…

蓝桥杯刷题024——天干地支

2020国赛 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个&#xff0c;分别为&#xff1a;甲&#xff08;jiǎ&#xff09;、乙&#xff08;yǐ&#xff09;、丙&#xff08;bǐng&#xff09;、丁&#xff08;dīng&#xff09;、戊&#xff08;w&#xff09…

IO知识整理

IO 面向系统IO page cache 程序虚拟内存到物理内存的转换依靠cpu中的mmu映射 物理内存以page&#xff08;4k&#xff09;为单位做分配 多个程序访问磁盘上同一个文件&#xff0c;步骤 kernel将文件内容加载到pagecache多个程序读取同一份文件指向的同一个pagecache多个程…

MySQL(五)

通过索引进行优化 索引基本知识 索引的优点 1、大大减少了服务器需要扫描的数据量2、帮助服务器避免排序和临时表3、将随机io变成顺序io 索引的用处 1、快速查找匹配WHERE子句的行2、从consideration中消除行,如果可以在多个索引之间进行选择&#xff0c;mysql通常会使用找到…

【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由

前言 (&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨 大家好&#xff0c;这里是小圆 现在开始每天都给大家 分享些关于python爬虫的案例教学 从最简单的开始 — 采集图片壁纸 今天就来扒拉这个优质的壁纸网站~ 网址 &#x1f447; 顺便瞧一眼 这里的…

30 - 面向对象的其他语法

目录 一、本章重点 二、对象的分类 1、类对象 &#xff08;1&#xff09;理解 &#xff08;2&#xff09;作用 2、实例对象 &#xff08;1&#xff09;理解 三、属性的划分 1、实例属性 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;定义 &#xff08;3&#xff09…

操作系统的概念,功能和目标

一、概念&#xff1a; 操作系统是指①控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以②提供给用户和其他软件方便的接口和环境&#xff0c;它③是计算机系统中最基本的系统软件。 二、功能和目标&#xff1a;…

零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试案例&#xff1a; 基于veth pair、namespace以及路由技术&#xff0c;实现跨主机命名空间之间的通信 1、网络拓扑如下 2、网络拓扑构建…

【第二章】(1)了解系统内核和 Shell 终端的关系与作用

&#x1f427;2.1强大好用的Shell&#x1f9ca;1.什么是Shell&#xff1f;&#x1f9ca;2.Bash解释器的优势&#x1f427;2.2 执行命令的必备知识&#x1f9ca;1.Linux命令的格式&#x1f9ca;2.四个快捷键/组合键小技巧&#x1f9ca;1.什么是Shell&#xff1f; ​ 一台…

shell脚本的编写以及shell中语句(嵌入式学习)

shell学习shell脚本编写步骤shell变量功能性语句1.read2.expr3.let4.test逻辑运算符的书写格式结构性语句1.if…then…fi2、case...esac3、for..do..done4、while..do..doneshell脚本 将shell命令按照一定的逻辑顺序实现指定功能&#xff0c;放到一个文件中。文件叫脚本文件&a…

几个Base64编码工具,也有蹊跷

起因 需求&#xff1a;对一段内容进行base64加密&#xff0c;然后通过url的get请求进行发送到后台&#xff0c;由于加密的内容比较少&#xff0c;base64串也不是很长&#xff0c;我认为此方案可行。 于是找了三个base64编码的在线工具&#xff0c;分别是&#xff1a; 平台1&…

设计模式第六讲:责任链模式和迭代器模式详解

一. 责任链模式 1. 背景 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导…

【Java基础】020 -- 常见API

目录 一、游戏打包exe 二、Math 1、Math类的常用方法 ①、代码实现 2、小结 3、练习 ①、练习一&#xff1a;改进判断一个数是否为一个质数 ②、练习二&#xff1a;自幂数 三、System 1、时间原点 2、常用方法 3、课堂练习 4、注意事项 5、小结 四、Runtime 1、常用方法 2、练习…