汉诺塔(递归)

文章目录

、汉诺塔简介

二、汉诺塔实现


一、汉诺塔简介

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

二、汉诺塔实现

我通过自己画的图给各位详解一番,下面是只有一个盘圆的时候也就是n=1时,为了方便后面都用n来表示圆盘个数,三根柱子我用A,B,C表示,这里要想将圆盘从A移动到C,直接挪动就行了,不需要借助B柱

A->C;

汉诺塔(递归)_第1张图片

 但是当圆盘大于1时,n>1时就需要借助B柱,当n=2时,先将上层的那个圆盘挪到B柱,然后将A剩下的挪到C柱,最后将B柱上剩余的一个圆盘挪到C就实现了,第一步:A->B,第二部:A->C,第三步:B->C。直到A,B两根柱子都没有圆盘就不再挪动了,下面同样通过我画的图给大家展示出来。

汉诺塔(递归)_第2张图片

 由上图可以清楚的看出,总共执行了三步。

也许上面两图还不能看出上面规律,下面我在描述当圆盘为3时,n=3,与圆盘为2时想法一样,先将最底层之上的挪到B柱,将剩余的那个挪到C中,但是我们这里如何将A中除最底层(也就是第n个)之外的挪到B柱中,我们需要借助C柱将A柱除最底层的圆盘n-1挪到B柱。当n=3时,是这样挪动的。

第一步:A->C,第二步:A->B,第三步:C->B,第四步:A->C,第五步:B->A,第六步:B->C,第七步:A->C,至此将A柱上所有圆盘都挪到C柱

 

如此七步将A柱中全部圆盘挪到C柱中,其实通过这上面的规律不难发现,要想将底层最大的挪到C中,需要将 它上面的(n-1)全部挪到B中,才能将第n个圆盘挪至C中,而此时B中的圆盘又和最开始没有挪动的A柱一模一样,我们有需要用同样的方法将B柱上n-2个圆盘挪到A柱中将其第n-1个圆盘挪到C中,如此n-2个圆盘全在A柱子中了。可以得出,我们这个过程会不断重复,且在重复的过程中,A,B柱上的圆盘会在不断地减少(这里是它总共的,因为大的不断的挪动到C中),这样重复且不断化为小的问题我们用到递归来解决。我们就重复将n-1个圆盘给B柱或者A 柱,将最大的(第n个)圆盘挪到C柱。

下面我们来看代码实现

#include
int count = 0;
void hanoi(int n, char A, char B, char C)
{
	if (n == 0)
		return;
	else if (n == 1)
	{
		count++;
		printf("第%d步\n", count);
		printf("%c->%c\n", A, C);
	}
	else
	{
		hanoi(n - 1, A, C, B);
		count++;
		printf("第%d步\n",count);
		printf("%c->%c\n", A, C);
		hanoi(n - 1, B, A, C);
	}  
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	printf("总共用了%d步", count);
	return 0;
}

汉诺塔(递归)_第3张图片这里是3步,被遮了

汉诺塔(递归)_第4张图片 这里是15步

汉诺塔(递归)_第5张图片 

 

 count是我这里是创建的一个全局变量用来记录挪动圆盘所需要的次数。

下面为圆盘为两个时我通过递归调用的过程演示

 汉诺塔(递归)_第6张图片

 

其实通过运行结果我们可以发现一个规律,当圆盘变化是挪动次数也在变化且为2的n-1次方(n>=1)可想而知要挪动64个圆盘,需要2的63次方步。这是一个多么庞大的工程啊!好了今天的汉诺塔就分享到这里了,但愿看见的小伙伴能不惜一键三连!!!!

你可能感兴趣的:(c语言,算法,开发语言)