C语言 – 汉诺塔详解(超详细)

C语言 – 汉诺塔详解(超详细)文章目录一 前言二 汉诺塔打印步数三 汉诺塔打印步骤一 前言一 汉诺塔 TowerofHanoi 又称河内塔 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定 在小圆盘上不能放大圆盘 在三根柱子之间一次只能移动一个圆盘 A B C 二 汉诺塔打印步数 1

一、前言

一、汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

在这里插入图片描述
         A       B       C

二、玩游戏

三、汉诺塔打印步数

  • 目的:不使用递归计算1个n层的汉诺塔从A柱到C柱的所有步数
  • 原理:如下
  • 平台:Visual studio 2017 && windows
    */

塔数 步数 规律
1 1 2^1 – 1
2 3 2^2 – 1
3 7 2^3 – 1
4 15 2^ 4 – 1
5 31 2^5 – 1
2^n – 1

实现代码:

#define _CRT_SECURE_NO_WARNINGS #include 
     #include 
     int main() { 
    int num = 0; scanf("%d", &num);//塔数 printf("完成%d层的汉诺塔需要%d步\n", num, (int)pow(2,num) - 1); return 0; } 
  • 目的:使用递归计算1个n层的汉诺塔从A柱到C柱的所有步数
  • 原理:
    1.将n-1个碟子从A杆经C杆移动到B杆
    2.将A杆上的第n个碟子移动到C杆
    3.将n-1个碟子从B杆经A杆移动到C杆
    在这里插入图片描述
    所以: f (n -1 ) + 1 + f (n – 1);  ->  2 * f (n – 1) +1; 这个式子叫做递推式










  • 平台:Visual studio 2017 && windows
    */

实现代码:

#define _CRT_SECURE_NO_WARNINGS #include 
     int Hanio_twice(int num) { 
    if(1 == num) return 1; else return 2 * Hanio_twice(num - 1) + 1; } int main() { 
    int num = 0; scanf("%d", &num);//塔数 int ret = Hanio_twice(num); printf("完成%d层的汉诺塔需要%d步\n", num, ret); return 0; } 
步数 规律
1 2 ^ 1 – 1
3 2 ^ 2 – 1
7 2 ^ 3 – 1
64 2 ^ 64 – 1

四、汉诺塔打印步骤

/*

  • 目的:使用递归打印1个n层的汉诺塔从A柱到C柱的所有步骤
  • 原理:封装1个函数Hanio(num, ‘A’, ‘B’, ‘C’)。
    其中num是塔数;A、B、C,3个字符为抽象成的3个柱子。
    如果只有1层那么输出A;
    否则就有2种情况,其1是将n-1个碟子从A经C到B。其2是将n-1个碟子从B经A到C






  • 平台:Visual studio 2017 && windows
    */

塔数步骤
1A->C
2A->B、A->C、B->C
3A->C、A->B、C->B、A->C、B->A、B->C、A->C
4A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C
A->B
A->C

实现代码:

#define _CRT_SECURE_NO_WARNINGS #include 
     void Hanio_Step(int n, char A, char B, char C) { 
    if (1 == n) printf("%c->%c\n", A, C); else { 
    Hanio_Step(n-1, A, C, B); printf("%c->%c", A, C); Hanio_Step(n-1, B, A, C); } } int main() { 
    int n = 0; scanf("%d", &n); Hanio_Step(n, 'A', 'B', 'C'); return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202703.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:30
下一篇 2026年3月19日 下午11:30


相关推荐

  • Void – 开源 Cursor 替代品,让 AI 帮你创建文件、写代码[Win/macOS]

    Void – 开源 Cursor 替代品,让 AI 帮你创建文件、写代码[Win/macOS]

    2026年3月15日
    2
  • 代理服务器和反向代理服务器详解

    代理服务器和反向代理服务器详解通常我们所说的代理 都是指的客户端向外界发起请求时 并不是直接与目标服务器连接 而是经过一个代理服务器 将所有请求交给代理服务器 由它去负责连接外界的目标服务器 同时从服务器返回的数据 也经过代理服务器 返回到客户端 在外界看来 所有请求都是来自这台代理服务器 这样就成功的将客户端隐藏在自己身后 起到了一种保护客户端的作用 而 反向代理 却是反过来的 它是针对服务器的一种代理技术 反向代理

    2026年3月17日
    1
  • RC有源滤波器之带通滤波器(四)

    RC有源滤波器之带通滤波器(四)记录一下,方便以后翻阅~过去的滤波器都是由R、L、C等无源元件组成,称为无源滤波器。现在的滤波器大都是由R、C元件与有源器件(如运算放大器)组成,称为RC有源滤波器。常见滤波器类型有低通滤波器、高通滤波器、带通滤波器、带阻滤波器、全通滤波器等。RC有源带通滤波器带通滤波器允许某一频率范围内的信号通过,衰减或抑制此频率范围以外的频率信号。理想带通滤波器的模频特性如下图所示,Wc2和Wc1分别为上下截止频率。RC有源带通滤波器器电路如下图所示:电压传输函数为:其模:…

    2022年6月7日
    49
  • oracle 的dba users表,oracle DBA 常用表和视图

    oracle 的dba users表,oracle DBA 常用表和视图dba 开头 dba users 数据库用户信息 dba segments 表段信息 dba extents 数据区信息 dba objects 数据库对象信息 dba tablespaces 数据库表空间信息 dba data files 数据文件设置信息 dba temp files 临时数据文件信息 dba rollback segs 回滚段信息 dba

    2026年3月18日
    3
  • windows启动mongo服务_启动windows

    windows启动mongo服务_启动windows在windows下启动mongodb,安装在这里不再赘述。1.打开运行窗口输入cmd,切换到mongodb的bin文件目录下;2.mongodb的data可以放在你自行创建的目录下,这里放在:F:\mongodb\dataFile输入命令:mongod –dbpath “F:\mongodb\dataFile”,如下:E:\MongoDB\bin>

    2025年7月17日
    6
  • 即梦AI海外版(Dreamina ai)推出新模型Seedream3.0,英文排版效果惊艳!

    即梦AI海外版(Dreamina ai)推出新模型Seedream3.0,英文排版效果惊艳!

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号