C语言实现汉诺塔并测试运行速度
前言
汉诺塔源自印度传说,由于其鲜明的递归性也是介绍递归算法的经典例子,本文主要介绍用C语言实现汉诺塔算法。因为在了解了汉诺塔传说后的好奇我也对进行了计时测试,结果暂且不表。
一、汉诺塔传说
了解汉诺塔的历史可以帮助我们提起对它的兴趣,也可以帮助我们更好的理解。
相传在梵天(印度教创造之神三主神之一)创世时在世界的中心贝纳勒斯(梵文名:瓦拉纳西,印度教圣地)的一座圣庙中设立了三根金刚石柱,第一根柱子上从上往下穿着从小到大的64片黄金圆片。三根柱子和64片黄金圆片就是汉诺塔,现在的益智玩具汉诺塔就是它的缩小版。在圣庙里有着婆罗门(印度四姓中最高种姓)不分昼夜一刻不停的按照一次搬运一片黄金圆片且无论在哪一根柱子上小的黄金圆片永远在大的黄金圆片之上的规则,从第一根柱子把黄金圆片搬到另一根柱子上。
婆罗门预言当所有的黄金圆片从第一根柱子上移动到另一根柱子上的时候就是众生泯灭世界毁灭之日。
二、汉诺塔算法原理
我们已经知道了汉诺塔的规则:已知有三根柱子A、B、C,假设A柱有若干圆片,现可以借助C柱要将A柱上的圆片全部移动到B柱。一次只能移动一个圆片且小圆片永远在大圆片之上。(这里也是汉诺塔有意思的地方)
例一:A柱有2片圆片从上往下分别是小圆片和大圆片,现将2片圆片从A柱移动到B柱
1.先将小圆片从A柱移动到C柱,移动一次;
2.再将大圆片从A柱移动到B柱,移动二次;
3.把小圆片从C柱移动到B柱,移动三次;
例二:A柱有3片圆片从上往下分别是小圆片、中圆片和大圆片,现将3片圆片从A柱移动到B柱
1.先将小圆片从A柱移动到C柱,移动一次;
2.再将中圆片从A柱移动到B柱,移动二次;
3.把小圆片从C柱移动到B柱,移动三次;
4.将大圆片从A柱移动到C柱,移动四次;
5.将小圆片从B柱移动到A柱,移动五次;
6.将中圆片从B柱移动到C柱,移动六次;
7.将小圆片从A柱移动到C柱,移动七次;
我们可以看到当汉诺塔层数为2时,圆片移动次数为2的平方减一等于3次,当汉诺塔层数为3时,圆片移动次数为2的3次方减一等于7次,如果你感兴趣可以继续往下推导,继续往下推导我们可以得到规律:移动次数 = 2的汉诺塔层数次方 – 1。假设有n层汉诺塔,则圆片移动次数为2的n次方减一。
关于递归:递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,来解决问题的基本方法。汉诺塔的递归就是调用自身,层层递归使层数递减直至层数为1(n = 1)。
三、C语言代码实现
#include<stdio.h>
void Hanoi(int n,char a,char b,char c);//递归函数
void Move(int n,char a,char b)