汉诺塔

递归实现汉诺塔:

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

      首先,我们需注意到在移动圆盘时应遵守以下移动限制条件

      1.在小圆盘上不能放大圆盘。

     2.在三根柱子之间一回只能移动一个圆盘。

     3.只能移动在最顶端的圆盘

则设A为存放盘子的塔,B为中间的辅助塔,C为目标塔 
思路如下:

1、把A上面n-1个盘子移动到B上。

2、把A上最后一个移动到C;

3、把B上n-1个移动到A上,再把B上最后一个移动到C;

如此循环2,3,步骤,直到把最后一个盘子移动到C上

注:1个盘子1步,2个盘子3步,3个7步,4个15步,n个(2^n)-1步

int count = 0;//标记移动次数

void Move(char x,char y)//移动盘子函数
{
	count++;//每移动一次加1
	printf("%c->%c\n",x,y);//每移动一次打印一次
}

void Hanio(char a,char b,char c,int n)//从a通过b移到c  n为盘子的数量
{
	if(n == 1)
	{
		Move(a,c);
	}
	else
	{
		Hanio(a,c,b,n-1);//递归调用
		Move(a,c);
		Hanio(b,a,c,n-1);//递归调用
	}
}

int main()
{
	Hanio('A','B','C',4);
	printf("%d\n",count);

	return 0;
}

通过n=2、3、4个盘子的移动进行递归解释 

汉诺塔_第2张图片 

两个盘子(3步)的情况:

汉诺塔_第3张图片

三个盘子(7步)的情况:

汉诺塔_第4张图片

四个盘子(15步)的情况:

汉诺塔_第5张图片

 

 

你可能感兴趣的:(C语言)