Hanoi(汉诺)塔问题。这是一个古典的
数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图8.13)。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。
资料上给出的程序如下:分析:(将n个盘子从A座移到C座可以分解为以下3个步骤:
(1) 将A上n-1个盘借助C座先移到B座上。
(2) 把A座上剩下的一个盘移到C座上。
(3) 将n-1个盘从B座借助于A座移到C座上。
)
程序:
#include <stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);
/* 对hanoi函数的声明 */
int m;
printf("input the number of diskes:");
scanf(“%d”,&m);
printf("The step to moveing %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)
/* 定义hanoi函数,将n个盘从one座借助two座,移到three座 */
{
void move(char x,char y); /* 对move函数的声明 */
if(n==1) move(one,three);
else
{ hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three); }
}
void move(char x,char y) /* 定义move函数 */
{
printf(“%c-->%c\n",x,y);
}
运行情况如下:
input the number of diskes:3↙
The steps to noving 3 diskes:
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C
我想问的是,在这几句中:
void move(char x,char y); /* 对move函数的声明 */
if(n==1) move(one,three);
else
{ hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three); }
}
到底是怎么调用的,形实参的传递是如何执行的。特别是两个hanoi函数的形实参值的传递,我被这程序搞糊涂了,我怎么也想不通这个程序会达到题目中所要求的那样,请高手们帮帮我的忙,详细解释、分析一下程序的执行,请务必详细!!!!当然,若能说一下程序的构思就更好了!!!!!!
汉诺塔问题,请高手帮忙,解释清楚!!!本人很无奈!!!c语言中最不清楚的就是汉诺塔问题!!!!!!!但一直没得到解决!
确实,初学C的时候,汉诺塔的递归看起来确实是比较神奇的程序。
其中主要就在hanoi 这个递归函数,传的参数里面有一个n 代表是几层递归。
如果n=1 代表只有一个,move(one,three); 就是把第一个移到第三个就行了。否则
第一个柱子上有n个(n>1) 要移到第三个。需要把上面的n-1个移到第二个,最下面的一个移到第三个,再把第二个柱子上的n-1个移到第三个。 要这三个步骤。
其中,第一个,和第三个步骤,和本身其实是一样的。
就是把n-1个移到第二个,注意hanoi的参数
/* 定义hanoi函数,将n个盘搭饥从one座借助two座,移到three座 */
two 即第二个参数,这是表示用来借助的
就假设n=2 吧 hanoi(2,'A','B','C'); 变成了
hanoi(1,A,C,B); //这个代表A座上有一块,需要借助C座,移到B座
A--->C
hanoi(1,B,A,C); /知哪返/这个代表B座上有一块,需要借助A座,移到C座
最后会输出
A-->B
A-->C
B-->C
假设n=3 hanoi(3,'A','B','C');
hanoi(2,A,C,B); //这个代表A座上有两块,需要借助C座,移到B座
A--->C
hanoi(2,B,A,C); //这个代表B座上有两块,需要借助A座,移到C座
A座上有两块,需要借助C座,缓携移到B座 会输出
A-->C
A-->B
C-->B
B座上有两块,需要借助A座,移到C座 会输出
B-->A
B-->C
A-->C
看到这么多疑问我敢肯定一点,你并没有真正意识到什么态世叫递归程序?这个程序不是一清敬个很简单的程序,如果搞不清递归的详细定义,即使你明白了这个程序,也是勉强,如果想彻答闭慎底了解到递归,必须了解它的定义,思路清晰后再看这道题就很简单了,相信你自己也可以独自解析这个程序。我下面有一个图还是比较简单明了的介绍递归的,可以参考下。
如果只有一个盘,直接把它从one移到three位置;若有n个盘,就假设有n-1个可以知道怎么移,那么把上边n-1个盘从one移到two位置,再把最底第n个盘从one移到three位晌漏置岁谨派,最后把其余n-1个从two移到three位置。问题就解决了。
对于n-1可以依靠n-2解决,以此类推,直到2个盘时可以依靠1个盘的解决方法,到1个乎贺盘时,已经给出了解决方法。这就是递归的思想,类似于数学的归纳法。
buhui
pp