C语言关于汉若塔(hanoi)问题理解

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

这是c语言实现汉若塔的代码:

#include
void hanoi(int n,char a,char b,char c);
main()
{
	int n;
	scanf("%d",&n);
	hanoi(n,'a','b','c');
	return 0;
 } 
 
 void hanoi(int n,char a,char b,char c)
 {
 	if(n==1)
 	printf("%c-->%c\n",a,b);
 	else{
 		hanoi(n-1,a,c,b);//把a上n-1的挪到c去
 		printf("%c-->%c\n",a,b);//把自定义函数中a上n的挪到b去
		hanoi(n-1,c,b,a);//把c上的n-1挪到b去
	 }
 }

有3根柱子a,b,c该代码的目的时使n个金片按步骤从a套到b,其中c作为中转的柱子

我的理解:

一共有n个金片,首先先把金片分为n,n-1两组

                 a                                   b                                          c

C语言关于汉若塔(hanoi)问题理解_第1张图片

 第一步就是调用hanoi函数:把n-1挪到c,把n挪到b

C语言关于汉若塔(hanoi)问题理解_第2张图片

 就变成这样,然后你就把最底下的你拿到b上了,此时n就不用去管它,由于之前一步是从c开始的hanoi(n-1,c,b,a),所以你把n-1在分,分成n-1和n-2这一部分C语言关于汉若塔(hanoi)问题理解_第3张图片

 因为从c开始你就要把n-2挪到a,n-1挪到b

C语言关于汉若塔(hanoi)问题理解_第4张图片

 由于你又把自定义函数的c和a互换了,所以此时又从a开始,就这样反复套娃,直到你n-1=1时你就只有把n-1从中间一放就ok了。

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