《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

《Git深度解析》:版本管理实战全解

🌟心向往之行必能至


🎥Cx330🌸的简介:


前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

目录

前言:

递归,搜索与回溯算法前置知识

1. 汉诺塔

算法原理(递归):

思路:

算法流程:

解法代码(C++):

博主手记(字体还请见谅哈):

结尾:


递归,搜索与回溯算法前置知识

1. 汉诺塔

题目链接:

面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(递归):

思路:

这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:

  • 假设 n=1 ,只有一个盘子,很简单,直接把它从A中拿出来,移到C上;
  • 如果 n=2呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要3步(为了方便叙述,记A中的盘子从上到下为 1号,2号)
    • 1号盘子放到 B 上
    • 2号盘子放到 C上
    • 3号盘子放到 C 上
      至此,C中的盘子从上到下为 1号,2号。
  • 如果 n>2 呢?这时我们需要用到 n=2 时的策略,将A上面的两个盘子挪到 B 上,再将最大的盘子挪到 C 上 ,最后将 B 上的小盘子挪到 C 上就完成了所有步骤。假如 n=3 时如下图:

因为 A 中最后处理的是最大的盘子,所以在移动过程中不存在大盘子在小盘子上的情况。
则本题可以解释为:

  • 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘子移动到C柱上。
  • 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
    • a.将 A 柱上的上面 n-1 个盘子移动到B柱上。
    • b.将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到C柱上。
  • 当问题的规模变为 n=1 时,即只有⼀个盘子时,我们可以直接将其从 A 柱移动到 C 柱
  • 需要注意的是,步骤 2.b 考虑的是总体问题中的 子问题b 情况。在处理子问题的子问题b 时,我们应该将 A 柱中的最上面的盘子移动到 C 柱,然后再将 B 柱上的盘子移动到 C 柱。在处理总体问题的子问题b 时,A 柱中的最大盘子仍然是最上面的盘子,因此这种做法是通用的
算法流程:

递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)

  • 返回值:无;
  • 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
  • 函数作用:将 A 中的上面 n 个盘子挪到 C 中

递归函数流程:

  • 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
  • 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
  • 将 A 中最上面的⼀个盘子挪到 C 中;
  • 将 B 中上面 n-1 个盘子挪到 C 中
解法代码(C++):
class Solution { public: void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) { if(n==1) { C.push_back(A.back()); A.pop_back(); return; } dfs(A,C,B,n-1); C.push_back(A.back()); A.pop_back(); dfs(B,A,C,n-1); } void hanota(vector<int>& A, vector<int>& B, vector<int>& C) { int n=A.size(); dfs(A,B,C,n); } };
博主手记(字体还请见谅哈):

结尾:

汉诺塔问题的递归解法,通过分解问题规模,将n个盘子的移动转化为n-1个子问题。算法核心是将A柱的n-1个盘子暂存B柱,移动最大盘子到C柱,再将B柱盘子移到C柱。并强调递归终止条件(n=1时直接移动),展示了递归思想在经典算法问题中的应用

Read more

从 0 到 1:2026 年 Python 全栈开发学习路线,保姆级教程

作为一名编程初学者,你是否曾对着五花八门的技术名词感到迷茫?是否想入门开发却不知道从哪下手?2025 年,Python 全栈开发依然是最适合零基础入门的技术方向——它语法简洁像“伪代码”,生态完善能覆盖从后端到数据分析的全场景,就业面广(Web 开发、自动化、AI 应用等都能做),而且企业对 Python 全栈开发者的需求仍在持续增长。这篇文章会像“保姆”一样,带你从 0 搭建完整的学习路径,全程无废话、无门槛。 一、Python 全栈学习路线总览 Python 全栈开发核心是“前端 + 后端 + 数据库 + 部署”的闭环能力,我把整个学习过程拆解为 6 个阶段,循序渐进不跳步: 1. Python 基础语法(打地基) 2. Web 后端开发(核心能力) 3.

By Ne0inhk
OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

🦞 长文警告! 📜 文章目录(点击跳转,这波操作稳如老狗) 1. 前言:别再当云端 AI 的韭菜了,把“小龙虾”养在自己家 2. 第一步:给电脑装个“胃”——下载安装 Python(含官网地址) 3. 第二步:请个本地“大脑”——Ollama + Qwen 模型(白嫖党狂喜) 4. 第三步:搭个“龙虾笼子”——安装 OpenClaw(附项目地址) 5. 第四步:用 Python 写个“传话筒”,让你的小龙虾听你指挥 6. 第五步:第一次对话——你的本地贾维斯上线 7. 总结:白嫖虽好,但别让龙虾把你的电脑“钳”

By Ne0inhk
Python爬虫实战实例:Python6个爬虫小案例(附源码)收藏这篇就够了

Python爬虫实战实例:Python6个爬虫小案例(附源码)收藏这篇就够了

引言 随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。 ==(文末获取Python入门学习资料+视频教程+学习路线)== 一、爬虫原理 爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类浏览网页的行为,发送HTTP请求,获取网页源代码,再通过解析、提取等技术手段,获取所需数据。 1. HTTP请求与响应过程 爬虫首先向目标网站发送HTTP请求,请求可以包含多种参数,如URL、请求方法(GET或POST)、请求头(Headers)等。服务器接收到请求后,返回相应的HTTP响应,包括状态码、响应头和响应体(网页内容)。 2. 常用爬虫技术 (1)请求库:如requests、aiohttp等,用于发送HTTP请求。 (2)解析库:如BeautifulSoup、lxml、PyQuery等,

By Ne0inhk
【Python】【数据分析】Python 数据分析与可视化:全面指南

【Python】【数据分析】Python 数据分析与可视化:全面指南

目录 * 1. 环境准备 * 2. 数据处理与清洗 * 2.1 导入数据 * 2.2 数据清洗 * 示例:处理缺失值 * 示例:处理异常值 * 2.3 数据转换 * 3. 数据分析 * 3.1 描述性统计 * 3.2 分组分析 * 示例:按年龄分组计算工资的平均值 * 3.3 时间序列分析 * 4. 数据可视化 * 4.1 基本绘图 * 示例:柱状图 * 4.2 使用 Seaborn 绘制图表 * 示例:箱型图 * 4.3 高级可视化技巧 * 示例:热力图

By Ne0inhk