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

C++ 汉诺塔问题详解与代码实现

介绍 C++ 汉诺塔问题的解决方案,涵盖问题定义、递归与非递归(迭代)代码实现、复杂度分析及数学公式推导。内容包含完整可运行代码示例及变种说明,适用于算法学习。

日志猎手发布于 2026/3/28更新于 2026/9/464 浏览

汉诺塔问题概述

汉诺塔问题是一个经典的递归问题,其目标是将一组盘子从一根柱子移动到另一根柱子,遵循以下规则:每次只能移动一个盘子,且大盘子不能放在小盘子上面。

递归思路的关键在于将问题分解为更小的子问题:假设有 n 个盘子,可以将问题分解为移动前 n-1 个盘子到辅助柱子,移动第 n 个盘子到目标柱子,再移动前 n-1 个盘子到目标柱子。

递归解法

代码实现

#include <iostream>
using namespace std;

void hanoi(int n, char source, char auxiliary, char target) {
    if (n == 1) {
        cout << "Move disk 1 from " << source << " to " << target << endl;
        return;
    }
    hanoi(n - 1, source, target, auxiliary);
    cout << "Move disk " << n << " from " << source << " to " << target << endl;
    hanoi(n - 1, auxiliary, source, target);
}

int main() {
    int n;
    cout << "Enter the number of disks: ";
    cin >> n;
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

逻辑分析

  1. 函数定义:hanoi 函数接受四个参数:盘子数量 n,源柱子 source,辅助柱子 auxiliary,目标柱子 target。
  2. 递归终止条件:当 n == 1 时,直接移动盘子从源柱子到目标柱子。
  3. 递归调用:
    • 将前 n-1 个盘子从源柱子移动到辅助柱子。
    • 移动第 n 个盘子到目标柱子。
    • 将前 n-1 个盘子从辅助柱子移动到目标柱子。

迭代解法

借助栈数据结构模拟递归过程,将每一步的操作压入栈中,逐个处理。这种方法避免了递归可能带来的栈溢出问题。

代码实现

#include <iostream>
#include <stack>
using namespace std;

struct Move {
    int n;
    char source, auxiliary, target;
};

void hanoiIterative(int n, char source, char auxiliary, char target) {
    stack<Move> s;
    s.push({n, source, auxiliary, target});
    while (!s.empty()) {
        Move current = s.top();
        s.pop();
        if (current.n == 1) {
            cout << "Move disk 1 from " << current.source << " to " << current.target << endl;
        } else {
            s.push({current.n - 1, current.auxiliary, current.source, current.target});
            s.push({1, current.source, current.auxiliary, current.target});
            s.push({current.n - 1, current.source, current.target, current.auxiliary});
        }
    }
}

int main() {
    int n;
    cout << "Enter the number of disks: ";
    cin >> n;
    hanoiIterative(n, 'A', 'B', 'C');
    return 0;
}

逻辑分析

  1. 结构体定义:Move 结构体保存每一步操作的信息。
  2. 栈的使用:初始化栈,压入初始状态。
  3. 循环处理:
    • 弹出栈顶操作。
    • 如果是移动单个盘子,直接输出。
    • 否则,按照递归的顺序压入子问题。

复杂度与公式

时间和空间复杂度

  • 递归解法:时间复杂度为 O(2^n),空间复杂度为 O(n)(递归栈深度)。
  • 非递归解法:时间复杂度同样为 O(2^n),空间复杂度为 O(n)(栈的最大深度)。

数学公式

汉诺塔问题的最小移动步数为 $2^n - 1$,其中 n 为盘子数量。

  • 1 个盘子:$2^1 - 1 = 1$ 步。
  • 2 个盘子:$2^2 - 1 = 3$ 步。
  • 3 个盘子:$2^3 - 1 = 7$ 步。

变种问题

  1. 双色汉诺塔:盘子分为两种颜色,移动时需遵循颜色交替规则。
  2. 循环汉诺塔:柱子排列成环形,移动方向受限。

这些变种通常需要调整递归或迭代逻辑以适应额外约束条件。

目录

  1. 汉诺塔问题概述
  2. 递归解法
  3. 代码实现
  4. 逻辑分析
  5. 迭代解法
  6. 代码实现
  7. 逻辑分析
  8. 复杂度与公式
  9. 时间和空间复杂度
  10. 数学公式
  11. 变种问题

更多推荐文章

查看全部
  • Python 装饰器的洋葱哲学:理解执行顺序与元编程
  • FPGA 常用音视频协议(DP、HDMI、USB4、GPMI、eDP、LVDS)性能对比
  • 基于 WebRTC+AI 的智能远程控制解决方案
  • Stable Diffusion WebUI Forge AI 绘画风格转换指南
  • Spring Boot 4 新特性:Jackson 3 ObjectMapper 异常处理简化,无需 try-catch
  • Stable Diffusion v1-5-pruned.safetensors本地部署指南
  • 青龙面板结合内网穿透实现定时任务自动化及远程监控
  • 实际项目里用了用 Copilot、Comate 和通义灵码,聊点真实感受
  • Python 路径拼接实战:os.path.join() 函数用法详解
  • Python 爬虫实战:批量抓取应用商店分类应用
  • Stable Diffusion v1.5 跨文化风格生成实战:浮世绘、拜占庭与非洲图腾
  • OpenClaw QQ 机器人接入指南
  • C++ 继承:面向对象代码复用的核心机制
  • 网络安全学习方向与路线详解
  • Stable Diffusion v1.5 Web UI 高级功能:图生图、局部重绘及蒙版编辑
  • MySQL 查询语法与 Linux 系统管理基础
  • 中小团队低成本搭建项目管理系统:Ubuntu 下 DooTask 私有化部署
  • Stable Diffusion v1.5 故障艺术与赛博朋克融合效果生成指南
  • C++ 多线程同步实战:互斥锁(mutex)详解
  • Python 递归实现任意进制转换

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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