news 2026/7/12 10:39:35

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《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时直接移动),展示了递归思想在经典算法问题中的应用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 21:23:52

Miniconda创建环境时出现Permission Denied解决

Miniconda创建环境时出现Permission Denied解决 在多用户服务器或容器化开发环境中&#xff0c;你是否曾遇到这样的场景&#xff1a;刚登录系统&#xff0c;满怀期待地输入 conda create -n myenv python3.9&#xff0c;结果终端却冷冰冰地返回一行红色错误&#xff1a; mkdir:…

作者头像 李华
网站建设 2026/7/7 22:35:36

HTML可视化输出:在Jupyter中展示PyTorch训练结果的技巧

HTML可视化输出&#xff1a;在Jupyter中展示PyTorch训练结果的技巧 在深度学习项目开发中&#xff0c;模型训练往往是一个“黑箱”过程——代码跑起来了&#xff0c;日志也在滚动&#xff0c;但你真的能一眼看清当前的状态吗&#xff1f;损失下降得是否平稳&#xff1f;准确率有…

作者头像 李华
网站建设 2026/7/7 22:35:59

快速上手MiniGPT-4:零基础完整部署指南

快速上手MiniGPT-4&#xff1a;零基础完整部署指南 【免费下载链接】MiniGPT-4 项目地址: https://ai.gitcode.com/hf_mirrors/Vision-CAIR/MiniGPT-4 MiniGPT-4作为前沿的多模态AI模型&#xff0c;能够实现图像与文本的智能交互&#xff0c;为用户提供强大的视觉问答能…

作者头像 李华
网站建设 2026/7/7 22:35:10

Linux系统I/O性能瓶颈深度解析:从/proc/diskstats到块设备驱动

Linux系统I/O性能瓶颈深度解析&#xff1a;从/proc/diskstats到块设备驱动 【免费下载链接】linux Linux kernel source tree 项目地址: https://gitcode.com/GitHub_Trending/li/linux 你是否曾经面对服务器I/O性能问题束手无策&#xff1f;当应用程序响应缓慢&#xf…

作者头像 李华
网站建设 2026/7/7 22:37:23

Photoshop下载安装教程:全流程详细图文指引,轻松安装与配置新版PS

前言 在电脑上安装 Photoshop 时&#xff0c;许多人都会遇到各种问题&#xff1a;安装报错、初始化卡顿、打开后界面空白……网上虽有大量教程&#xff0c;但不少内容早已过时、路径错误&#xff0c;甚至存在潜在安全风险。 本文将带来一份真正可用的 Photoshop下载安装教程&…

作者头像 李华
网站建设 2026/7/3 11:16:47

深度学习模型优化指南:从Transformer到高效架构的实践对比分析

深度学习模型优化指南&#xff1a;从Transformer到高效架构的实践对比分析 【免费下载链接】annotated-transformer An annotated implementation of the Transformer paper. 项目地址: https://gitcode.com/gh_mirrors/an/annotated-transformer 在深度学习模型部署过程…

作者头像 李华