当前位置: 首页 > news >正文

【数据结构】汉诺塔问题

汉诺塔问题的核心解法是递归分治思想,通过将复杂问题拆解为规模更小的子问题,逐步解决。以下是该代码的具体思路解析:

1. 问题拆解:将 n 个圆盘的移动分解为 3 步

汉诺塔的目标是将 A 柱上的 n 个圆盘(从小到大堆叠,大圆盘在下)全部移动到 C 柱,B 柱作为辅助,且需遵守:①每次只能移动 1 个圆盘;②任何时候大盘不能放在小盘上。

对于 n 个圆盘,递归思路是:

  • 第一步:先将 A 柱上的前 n-1 个圆盘借助 C 柱作为辅助,移动到 B 柱上(此时 A 柱只剩最大的第 n 个圆盘);
  • 第二步:直接将 A 柱上剩下的最大圆盘(第 n 个) 移动到 C 柱(此时最大圆盘已就位,无需再移动);
  • 第三步:再将 B 柱上的n-1 个圆盘借助 A 柱作为辅助,移动到 C 柱上(此时所有圆盘都转移到 C 柱,完成目标)。

2. 递归终止条件:最小子问题(n=1)

当 n=1 时(只有 1 个圆盘),无需拆解,直接将圆盘从 A 柱移动到 C 柱即可,这是递归的 “base case”,避免无限递归。

3. 代码对应逻辑

  • hanoi(n, A, B, C)函数:递归核心,实现 “将 n 个圆盘从 A 柱经 B 柱辅助移到 C 柱”。
    • 若 n=1:直接调用move(A, 1, C),完成单个圆盘的移动;
    • 若 n>1:按上述三步拆解,通过两次递归调用处理 n-1 个圆盘的移动,中间调用move处理最大圆盘。
  • move(A, n, B)函数:辅助函数,打印移动过程(如a->c表示从 a 柱移动圆盘到 c 柱)。

示例:n=3 时的执行流程

  • 第一步:hanoi(2, A, C, B) → 将 A 上的 2 个圆盘移到 B(C 辅助);
    • 其中又拆解为:hanoi(1, A, B, C)(A 的 1 个移到 C)→ move(A, 2, B)(A 的 2 移到 B)→ hanoi(1, C, A, B)(C 的 1 移到 B);
  • 第二步:move(A, 3, C) → 将 A 上的 3 号圆盘(最大)移到 C;
  • 第三步:hanoi(2, B, A, C) → 将 B 上的 2 个圆盘移到 C(A 辅助);
    • 其中又拆解为:hanoi(1, B, C, A)(B 的 1 移到 A)→ move(B, 2, C)(B 的 2 移到 C)→ hanoi(1, A, B, C)(A 的 1 移到 C)。

最终输出移动步骤,完成 3 个圆盘的转移。

核心思想

通过递归将 n 个圆盘的问题不断拆解为 n-1、n-2…… 直到 1 个圆盘的最小问题,利用辅助柱的切换,逐步实现目标。这种分治策略是解决汉诺塔问题的经典方法,时间复杂度为 O (2ⁿ)(需移动 2ⁿ-1 次)。

C++代码如下:

#include <iostream>
using namespace std;// 声明函数原型
void hanoi(int n, char A, char B, char C);
void move(char A, int n, char B);int main() {int n;cin >> n;               // 读取输入的圆盘数量hanoi(n, 'a', 'b', 'c');// 调用汉诺塔函数,初始柱子为a, b, creturn 0;
}// 移动函数:打印从A柱移动第n号圆盘到B柱的过程
void move(char A, int n, char B) {cout << A << "->" << B << endl;
}// 汉诺塔递归函数:将柱A上的n个圆盘按规则搬到C上,B做辅助柱
void hanoi(int n, char A, char B, char C) {if (n == 1) {move(A, 1, C);  // 将编号为1的圆盘从A柱移到C柱} else {hanoi(n-1, A, C, B);  // 将A上编号为1至n-1的圆盘移到B, C做辅助柱move(A, n, C);        // 将编号为n的圆盘从A移到Chanoi(n-1, B, A, C);  // 将B上编号为1至n-1的圆盘移到C, A做辅助柱}
}

Python代码如下:

def hanoi(n, A, B, C):"""将柱A上的n个圆盘按规则搬到C上,B做辅助柱"""if n == 1:move(A, 1, C)  # 将编号为1的圆盘从A柱移到C柱else:hanoi(n-1, A, C, B)  # 将A上编号为1至n-1的圆盘移到B, C做辅助柱move(A, n, C)  # 将编号为n的圆盘从A移到Chanoi(n-1, B, A, C)  # 将B上编号为1至n-1的圆盘移到C, A做辅助柱def move(A, n, B):"""打印从A柱移动第n号圆盘到B柱的过程"""print(f"{A}->{B}")if __name__ == "__main__":n = int(input())hanoi(n, 'a', 'b', 'c')

Java代码如下:

import java.util.Scanner;public class Hanoi {// 移动方法:打印从A柱移动第n号圆盘到B柱的过程public static void move(char A, int n, char B) {System.out.println(A + "->" + B);}// 汉诺塔递归方法:将柱A上的n个圆盘按规则搬到C上,B做辅助柱public static void hanoi(int n, char A, char B, char C) {if (n == 1) {move(A, 1, C);  // 将编号为1的圆盘从A柱移到C柱} else {hanoi(n - 1, A, C, B);  // 将A上编号为1至n-1的圆盘移到B, C做辅助柱move(A, n, C);          // 将编号为n的圆盘从A移到Chanoi(n - 1, B, A, C);  // 将B上编号为1至n-1的圆盘移到C, A做辅助柱}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();  // 读取输入的圆盘数量hanoi(n, 'a', 'b', 'c');   // 调用汉诺塔方法,初始柱子为a, b, cscanner.close();}
}

http://www.dtcms.com/a/452901.html

相关文章:

  • AI - 自然语言处理(NLP) - part 2 - 词向量
  • 焦作做网站最专业的公司滨海新区做网站电话
  • 【JavaScript Proxy 与 Reflect 指南】
  • 【软件开发】管理类系统
  • 使用Unity引擎开发Rokid主机应用的全面配置交互操作
  • web服务器有哪些?服务器和web服务器有什么区别
  • 大数据Spark(六十七):Transformation转换算子distinct和mapValues
  • 【寰宇光锥舟】
  • 计算机视觉(opencv)——嘴部表情检测
  • 唤醒手腕2025年最新机器学习K近邻算法详细教程
  • 广州化妆品网站建设公司排名北京网站建设91086
  • 【纯AI观点】用于协作内容创建和知识管理的MediaWiki
  • 贵州省网站建设网站打开时的客户引导页
  • C++新标准——decltype 关键字
  • Java中通过.xml文件管理测试用例类
  • 清空全网题目系列 · 洛谷 · P1054 [NOIP 2005 提高组] 等价表达式
  • 偏振光阴影投影的三元光学逻辑处理器
  • GitLab 安装指南
  • 磁共振成像原理(理论)20:K空间采样 (Sampling of k-Space) - 采样定理
  • 安装wslgui
  • 激光+摄像头:打造高精度视觉测量系统
  • ie的常用网站渭南市建设局网站
  • 前端混入与组合实战指南
  • C++ 学习(3) ----设计模式
  • 畜牧业网站模板怎么做自己的网站平台
  • DAY 43 复习日-2025.10.7
  • 大数据毕业设计选题推荐-基于大数据的人体生理指标管理数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Auricore亮相杭州RWA峰会,以黄金RWA重塑Web3新生态
  • 于飞网站开发免费推广软件工具
  • ChainVault闪耀杭州RWA峰会,黄金RWA重塑Web3新生态