跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 递归算法实战:汉诺塔问题

C++ 递归算法解决汉诺塔问题。通过将 n 个盘子从 A 柱移动到 C 柱,利用辅助柱 B。核心逻辑是将 n-1 个盘子移至 B,最大盘移至 C,再将 n-1 个盘子从 B 移至 C。递归终止条件为 n=1 时直接移动。代码实现包含 dfs 辅助函数处理盘子移动逻辑。

晚风叙旧发布于 2026/3/22更新于 2026/8/1737 浏览
C++ 递归算法实战:汉诺塔问题

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

文章配图

文章配图

文章配图

1. 汉诺塔

题目描述:

文章配图

题目示例:

文章配图

算法原理(递归):
思路:

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

  • 假设 n=1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;
  • 如果 n=2 呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要 3 步 (为了方便叙述,记 A 中的盘子从上到下为 1 号,2 号)
    • 1 号盘子放到 B 上
    • 2 号盘子放到 C 上
    • 1 号盘子放到 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 时直接移动),展示了递归思想在经典算法问题中的应用

    目录

    1. 递归,搜索与回溯算法前置知识
    2. 1. 汉诺塔
    3. 算法原理(递归):
    4. 思路:
    5. 算法流程:
    6. 解法代码(C++):
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • CSS Flex 布局基础应用指南
    • Ubuntu 24.04 虚拟机安装教程
    • JDK 11 安装与环境变量配置教程
    • 前端请求后端返回 404/405/500 状态码排查与解决指南
    • AI 与存储的结合:智能存储的实践与挑战
    • 基于YOLOv8与LLM的Web目标检测及人脸表情识别系统
    • 基于 YOLO 与 LLM 的 Web 目标检测与智能分析系统
    • Z-Image Turbo 画板:低显存 AI 绘画稳定生成指南
    • Linux/C++多线程编程入门:核心概念与常用函数详解
    • AI 大模型系统学习路线:从入门基础到工程实战
    • 解决安装 WSL 及 Ubuntu 时出现的安全频道支持错误
    • HTTP 响应状态码详解
    • Java Web 开发实战:数据库操作与会话技术
    • C++ 线程安全容器设计与 STL 标准库兼容性解析
    • CentOS 7 及多种 Linux 发行版命令行连接 Wi-Fi 方法
    • GitHub 每日热门项目榜单 (2026-02-22)
    • 算法竞赛入门经典第 5 章:C++ 与 STL 入门代码示例
    • 网络安全入门指南:学习路线与方向选择
    • 大语言模型 LoRA 技术综述:原理、变体与应用
    • 2026 无人机 AI 算法全景图:7 大场景 50+ 算法详解

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

    • Markdown转HTML

      将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

    • HTML转Markdown

      将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online