c语言实现汉诺塔

  • 一.汉诺塔简介
  • 二.汉诺塔的实现

一.汉诺塔简介

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

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,
假如每秒钟一次,共需多长时间呢?一个平年365天有31536000秒,闰年366天有31622400秒,平均每年31557600秒,计算一下:
18446744073709551615秒这表明移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.42亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

二.汉诺塔的实现

有三根相邻的柱子,标号为x,y,z,x柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在借助y柱子把所有盘子一个一个移动到柱子z上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

我在知乎上看到一个很精辟的想法,就是将汉诺塔问题看成如何将大象放进冰箱,而我在用程序写出后也确实分为了主要的三步


由于一次只能挪动一个盘子那么该如何移动中间的4个呢?这时就需要应用递归的思想了。

我们将所有盘子分为两部分,1和n-1个,将n-1个圆盘从x移到y上,再将剩下的1个移到z上,最后再把y上的n-1个园移到z上

int a = 0;
void Move(int n,char c,char d)
{printf("第%d步 ", ++a);//每调用一次Move就代表走了一步,所以++aprintf("把%d号盘,从%c号柱移到%c号柱\n",n, c, d);
}
void Hanoi(int n,char x,char y,char z)
{if (n == 1){Move(n,x,z);//当n=1,直接将盘子从x移到z上}if (n > 1){Hanoi(n - 1,x,z,y);//上面的n-1个盘子,从x借助z(一个一个)移到yMove(n,x,z);//剩下的一个盘子从x移到zHanoi(n - 1,y,x,z);//再将n-1个盘子从y借助x(一个一个)移到z//把大象放进冰箱三步法}
}
int main()
{int n = 0;printf("请输入圆盘的个数>");scanf("%d", &n);Hanoi(n,'X','Y','Z');return 0;
}

我们以n=3为例,它的运行结果是这样的


ps:以上素材来源于网络

以上就是汉诺塔的详解啦,其实理解汉诺塔并不难,难的是这种递归是如何执行的,其实我本人对于递归的也未能很好理解,只能说是多做题多推演,或许在某一天就水到渠成,一下子就悟了呢。

c语言实现汉诺塔(图解)相关推荐

  1. c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  2. 用C语言实现汉诺塔的移动过程并且统计移动的次数

    用C语言实现汉诺塔的移动过程以及移动的次数 题目说明 一共有三个柱子,在一个柱子上穿有若干个圆盘,这些圆盘按下大上小叠放,将这个柱子上的圆盘按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放 ...

  3. 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

    前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...

  4. 最简单的python语言实现汉诺塔游戏

    最简单的python语言实现汉诺塔游戏 实现代码 def hanoi(n,ch1,ch2,ch3):if n==1:print(ch1, '->', ch3)else:hanoi(n - 1, ...

  5. C语言--实现汉诺塔【图文讲解,附代码】

    目录 (1)什么是汉诺塔 (2)汉诺塔打印步骤 (3)如何用C语言实现汉诺塔 (4)实现代码 (1)什么是汉诺塔   汉诺塔(Tower of Hanoi),又称河内塔.源自印度古老传说的一个游戏,大 ...

  6. 【C语言】汉诺塔问题(图文详解)

    汉诺塔 1. 什么是汉诺塔 2. 有关汉诺塔的有趣故事 3. 利用动画来演示汉诺塔 4. 如何用C语言实现汉诺塔 1. 什么是汉诺塔 源于印度古老传说的益智玩具 汉诺塔(Tower of Hanoi) ...

  7. c语言汉诺塔移动次数,C语言计算汉诺塔最小挪动步数 (二)

    C语言计算汉诺塔最小移动步数 (二) 前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较 ...

  8. C语言递归函数——汉诺塔问题笔记

    C语言递归函数--汉诺塔问题笔记 学C的时候老师根本没讲过递归,当时自己也没把它当回事,但是递归在算法中的地位实在太重要了.于是翻了翻C课本上的递归,书上讲的不多,但是一个经典的汉诺塔问题就让我伤透了 ...

  9. 三分钟教会你汉诺塔图解

    C语言实现汉诺塔 汉诺塔的实现主要分为3个步骤和一个出口条件 1.将n - 1个碟子从 x 经由 z 移动到 y 2.将第 n (x上的最大一个碟子) 个移动到 z 3.再将n - 1个碟子由 y 经 ...

最新文章

  1. 基于SSM实现公司内部培训系统的开发
  2. python恶搞代码-搞笑的程序猿:看看你是哪种Python程序员
  3. 广东省2021年普通高考成绩复查结果查询,广东省2021年普通高考英语听说考试成绩可以查询啦!...
  4. 日期控件的用法 winform
  5. nagios数据 mysql_读取NAGIOS数据库至MYSQL
  6. matlab y2=sin(3t)exp(-t/3);,Matlab-期末考试题库(共12套卷)
  7. 一周内被程序员疯转 2.4 W次,最终被大厂封杀!
  8. 构建复杂的应用程序(二)—— visual studio 下 C/C++ 项目开发
  9. Android开发工具集合
  10. 科学研究:统计来看,是不是新(接触的)人运气明显好?
  11. 终于完成了:为什么吾非要亲自搞CDKEY
  12. AutoCAD2020左键单击长按套锁功能
  13. 超级详细的手把手教你使用Lighthouse更好推动项目性能优化,性能指标详解,优化方法,需要关注指标分析
  14. 技术讲座:蔡学镛之架构师相关培训
  15. 阿里王坚:万物互联网=云计算+大数据
  16. OCCT 建模,VTK显示
  17. mysql 时间 本周 本月_MySQL日期查询:本周、本月、本季、本年
  18. C# 定时关机小应用
  19. Gimp 替换白色背景
  20. 火影忍者宇智波鼬动态壁纸带给大家

热门文章

  1. C语言:定义字符串的几种方式
  2. 猿如意中的【Java SE Development Kit 8】工具详情介绍
  3. 导入带隐藏列的Excel发生错位
  4. telerik:RadGrid导出Excel隐藏列
  5. 茶叶行业网站的盈利模式探讨
  6. iphone13升级ios16好不好 流畅度有没有改变
  7. 真爱空间网络办公OA
  8. 金软Visio文本抽出
  9. 一灯大师之点亮OK6410开发板上4个LED裸机程序---嵌入式回归第十篇
  10. c语言滑稽的编程,12个滑稽的C语言面试问答——《12个有趣的C语言问答》评析(5)...