hyx_蓝桥杯C++学习_系列二

news/2025/11/27 5:36:17/文章来源:https://www.cnblogs.com/hyx-ahpu/p/19275150

hyx_蓝桥杯C++学习_系列二

一、递归的介绍

1. 概念

递归是函数直接或间接调用自身的过程

2. 两个关键要素

  • 终止条件:防止无限递归,类似于循环的终止条件防止死循环
  • 递归表达式:递归的主体,将问题拆分为规模更小的子问题,子问题的答案合并成为当前问题的答案

示例:递归计算斐波那契数列

#include<bits/stdc++.h>
using namespace std;int F(int n){if(n<=2) return 1;           // 递归的终止条件,当n <= 2时停止递归else return F(n-1) + F(n-2); // 递归表达式部分,当n >= 3时,F(n) = F(n-1) + F(n-2)
}int main(){int n;cin >> n;int result = F(n);cout << result;return 0;
}

斐波那契数列定义:

  • 当 0 < n < 3 时,F(1) 和 F(2) 都等于 1
  • 当 n >= 3 时,F(n) = F(n-1) + F(n-2)

3. 直接调用 vs 间接调用

直接调用:函数直接调用自己

#include<bits/stdc++.h>
using namespace std;int factorial(int n){if(n == 0 || n == 1) return 1;    // 0和1的阶乘都是1else return n * factorial(n-1);   // 递归表达式:n * (n-1)!
}int main(){int n;cin >> n;int result = factorial(n);cout << result;return 0;
}

间接调用:多个函数相互调用

#include<bits/stdc++.h>
using namespace std;int B(int n);int A(int n){if(n<0) return 1;else return B(n-1);
}int B(int n){if(n<0) return 1;else return A(n-2);
}int main(){int n;cin >> n;int result_A = A(n);int result_B = B(n);cout << result_A << "  " << result_B;return 0;
}

执行过程分析:

输入 n A(n) 结果 B(n) 结果 执行路径
0 1 1 A(0)→B(-1)→1 / B(0)→A(-2)→1
1 1 1 A(1)→B(0)→A(-2)→1 / B(1)→A(-1)→1
2 1 1 A(2)→B(1)→A(-1)→1 / B(2)→A(0)→B(-1)→1
3 1 1 A(3)→B(2)→A(0)→B(-1)→1 / B(3)→A(1)→B(0)→A(-2)→1
4 1 1 A(4)→B(3)→A(1)→B(0)→A(-2)→1 / B(4)→A(2)→B(1)→A(-1)→1
5 1 1 A(5)→B(4)→A(2)→B(1)→A(-1)→1 / B(5)→A(3)→B(2)→A(0)→B(-1)→1

我们可以发现,无论输入任何正整数,A、B函数的返回值都是1。

二、递归与循环的比较

1. 递归的特点:

  • 直观、简洁,易于理解和实现
  • 适用于问题的规模可以通过递归调用不断减少的情况
  • 可以处理复杂的数据结构和算法,如树和图的遍历
  • 存在栈溢出风险(栈空间一般只有8MB,递归层数不宜过深,一般不超过1e6层)

2. 循环的特点:

  • 直接控制流程,效率较高
  • 适用于问题的规模没有明显的缩减,或者需要特定的迭代次数
  • 适合处理大部分的动态规划问题

提示:在部分情况下,递归和循环可以相互转化。

示例:最大公约数的两种实现

递归版本:欧几里得算法

int gcd_recursive(int a, int b){if(b == 0) return a;else return gcd_recursive(b, a % b);
}

循环版本

int gcd_iterative(int a, int b) {while (b != 0) {int temp = a % b;a = b;b = temp;}return a;
}

三、递归应用——汉诺塔问题

1. 什么是汉诺塔问题

有三根柱子(A、B、C),其中一根柱子A上有n个大小不同的圆盘,从小到大依次叠放(最大的在底部,最小的在顶部)。

要求

  1. 每次只能移动一个圆盘
  2. 移动过程中,大圆盘不能放在小圆盘上面
  3. 最终将所有圆盘从柱子A移动到柱子C
  4. 可以借助柱子B作为辅助

2. 问题分析

对于n个圆盘:

  1. 将前n-1个圆盘从A移动到B(借助C)
  2. 将第n个圆盘(最大的)从A移动到C
  3. 将n-1个圆盘从B移动到C(借助A)

代码实现

#include<bits/stdc++.h>
using namespace std;int step = 0; void hanoi(int n, char from, char to, char aux) {if (n == 1) {step++;cout << "the " << step << "th step: " << from << " -> " << to << " (disc 1)" << endl;return;}hanoi(n - 1, from, aux, to);step++;cout << "the " << step << "th step: " << from << " -> " << to << " (disc " << n << ")" << endl;hanoi(n - 1, aux, to, from);
}int main() {int n;cout << "the number of disc: ";cin >> n;cout << "\n begin to solve...\n" << endl;hanoi(n, 'A', 'C', 'B');cout << "\n finsh to solve! the sum of step: " << step << endl;return 0;
}

运行结果(n=5):

the number of disc: 5begin to solve...the 1th step: A -> C (disc 1)
the 2th step: A -> B (disc 2)
the 3th step: C -> B (disc 1)
the 4th step: A -> C (disc 3)
the 5th step: B -> A (disc 1)
the 6th step: B -> C (disc 2)
the 7th step: A -> C (disc 1)
the 8th step: A -> B (disc 4)
the 9th step: C -> B (disc 1)
the 10th step: C -> A (disc 2)
the 11th step: B -> A (disc 1)
the 12th step: C -> B (disc 3)
the 13th step: A -> C (disc 1)
the 14th step: A -> B (disc 2)
the 15th step: C -> B (disc 1)
the 16th step: A -> C (disc 5)
the 17th step: B -> A (disc 1)
the 18th step: B -> C (disc 2)
the 19th step: A -> C (disc 1)
the 20th step: B -> A (disc 3)
the 21th step: C -> B (disc 1)
the 22th step: C -> A (disc 2)
the 23th step: B -> A (disc 1)
the 24th step: B -> C (disc 4)
the 25th step: A -> C (disc 1)
the 26th step: A -> B (disc 2)
the 27th step: C -> B (disc 1)
the 28th step: A -> C (disc 3)
the 29th step: B -> A (disc 1)
the 30th step: B -> C (disc 2)
the 31th step: A -> C (disc 1)finsh to solve! the sum of step: 31

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

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

相关文章

【Java学习】【Java基础】--第3篇:初学模板方法模式和策略模式

一、模板方法模式 (Template Method Pattern) 1. 核心思想:骨架不变,细节可变 2. 模板方法模式的关键特点控制流程:父类控制算法骨架,子类实现具体步骤 代码复用:公共代码在抽象类中实现 扩展性:通过钩子方法提供…

mysql常用到的面试问题

1. MySQL 数据库的主要备份方式有哪些?答案:主要备份方式包括全量备份(完整备份整个数据库)和增量备份(仅备份自上次备份以来发生变化的数据)。工具有 mysqldump、XtraBackup 和物理备份。 2. 如何确保 MySQL 数…

充电模块厂家哪家好,2025充电模块厂家权威榜单

随着新能源汽车的普及,充电模块作为充电桩的“心脏”,其性能直接决定了充电效率与安全。面对市场上众多的充电模块厂家,如何避开营销噱头,选择一家真正靠谱的合作伙伴成为许多企业与采购者的难题。本文将为您呈现一…

电源模块厂家哪家好,2025电源模块厂家公司盘点

电源模块作为电子设备的“心脏”,其性能与可靠性直接关系到整个系统的稳定运行。面对市场上众多的电源模块厂家,如何找到那些在特定领域深耕细作、技术过硬但可能并不广为人知的优质企业呢?本文将为您盘点8家在2025…

2025杭州办公室保洁哪家好?权威排行

2025杭州办公室保洁哪家好?权威排行。随着杭州民营经济的蓬勃发展和办公模式的不断升级,办公室保洁已从传统的“扫地擦桌”升级为影响办公效率、企业形象和员工健康的关键服务。如今,杭州办公室保洁市场需求持续增长…

杭州公司日常保洁哪家好?2025杭州保洁公司精选榜单

杭州公司日常保洁哪家好?2025杭州保洁公司精选榜单。随着杭州城市建设的加快和企业办公环境标准化要求的提高,保洁服务已经成为城市运转和企业运营中不可或缺的一环。目前杭州保洁行业呈现出多元化发展的态势,从最初…

2025杭州商务楼保洁公司推荐综合实力榜单

2025杭州商务楼保洁公司推荐综合实力榜单。在杭州城市更新与商务发展的双重推动下,开荒保洁和商务楼保洁成为两类需求旺盛的专业保洁服务。开荒保洁主要针对新建成的建筑,包括写字楼、住宅、厂房等,负责清除施工遗留…

2025杭州保安公司综合实力榜单

2025杭州保安公司综合实力榜单。作为城市安全保障体系的重要组成部分,保安服务已深度融入杭州的住宅小区、商业综合体、产业园区、企业单位等各类场景,核心职责涵盖门禁值守、巡逻防范、安全检查、应急处置等,直接关…

杭州保洁外包服务哪家好?2025精选杭州园区保洁公司榜单

杭州保洁外包服务哪家好?2025精选杭州园区保洁公司榜单。伴随杭州产业园区的密集布局和企业运营效率提升需求的增长,保洁外包服务和园区保洁服务已成为产业生态中不可或缺的组成部分。保洁外包服务指企业将内部保洁工…

2025杭州专业物业管理公司权威排行

2025杭州专业物业管理公司权威排行。随着杭州城市化进程加快和房地产市场的成熟,物业管理已成为保障居民生活、企业运营和城市治理的重要基础服务。物业管理服务涵盖小区住宅、商业综合体、产业园区等多个场景,核心内…

基于SSE技术加 deepseek 实现打字机回复效果

具体代码,已上传到厂库 git clone https://gitee.com/rush_peng/sse-deepseek-demo.gitSSE 技术 go 后端实现 package mainimport ("bufio""bytes""encoding/json""fmt"&quo…

[zsh 专属配置 PS1 | 不依靠 oh my zsh]

# -------------------------- Zsh 专属 PS1 配置(含空行+conda/venv/git) -------------------------- # 颜色定义(Zsh用%F{颜色},而非Bash的\033) COLOR_CONDA="%F{cyan}" # 青色(conda环境) CO…

百航鹿大联训 roarctf_2019_easyheap

我现在心如死灰,面如平湖,胸有惊雷。 这里面水太深,你把握不住。😅 checksec是NO PIE的。来看代码。同样改了改函数名。 __int64 __fastcall main(int a1, char **a2, char **a3) {int v3; // eaxint v4; // ebxi…

图片云存储-七牛云

图片云存储-七牛云一、介绍 在实际开发中,我们会有很多处理不同功能的服务器。例如:应用服务器:负责部署我们的应用数据库服务器:运行我们的数据库文件服务器:负责存储用户上传文件的服务器  分服务器处理的目的…

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识彻底搞懂 Raft 算法:为“被理解”而生的分布式共识 在分布式系统的世界里,共识(Consensus)是一个核心难题:如何让一堆机器对某个值(比如数据记录)达成一致? …

龙哥量化:初版简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

代码随想录算法训练营第三章 哈希表part02

代码随想录算法训练营第三章 哈希表part02第454题.四数相加II leetcode链接:https://leetcode.cn/problems/4sum-ii/description/ 题目描述:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, …

AI:情绪冲动和阴性症状有什么关系

情感症状 和情绪冲动和阴性症状有什么关系 这个问题非常深刻,触及了精神病理学的核心。情感症状、情绪冲动与阴性症状的关系,与它们和阳性症状的关系完全不同,甚至可以说是相反的。 简单来说:阳性症状是正常功能的…

龙哥量化:简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

光缆地图网站

光缆地图网站几个全球公认最权威、最好用的光缆地图网站,各有特色: 1. 行业标准级:TeleGeography Submarine Cable Map 这是全球电信行业最权威的数据来源,也是 UI 做得最好看的。网址:https://www.submarinecabl…