[求助]汉诺塔问题苦思10小时以上,还不是不太理解。哪位大人是否可以帮忙解答
void move(char x,char y){
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char a,char b,char c)
{
if(n==1)move(a,c);
else
{
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
main()
{
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
getch();
}
当n==2时,汉诺塔用递归移动的步骤都能理解了
,但n==3时,A-C, A-B, C-B, A-C,B-A, B-C,A-C,主要是不能理解递归时,C-B,B-A,B-C 是哪个函数做实参的。抱歉,头想的有点糊涂了,表达不太清楚
----------------解决方案--------------------------------------------------------
hanoi(n-1,a,c,b); 这个递归是不是实现A塔到B塔的移动,他是如何实现C-B,B-A,B-C的
hanoi(n-1,b,a,c); 这个递归是不是实现B塔到C塔的移动呢?
----------------解决方案--------------------------------------------------------
不懂
----------------解决方案--------------------------------------------------------
hanoi(n-1,a,c,b); 这个递归是不是实现A塔到B塔的移动,他是如何实现C-B,B-A,B-C的 hanoi(n-1,b,a,c); 这个递归是不是实现B塔到C塔的移动呢?
你问得没有错,就是这样的!! 我对这个程序也看过好多次啦,我认为它的功能就是你 所说的那样!
----------------解决方案--------------------------------------------------------
递归思想要慢慢理解才能领悟,领悟后必然收益
汉诺问题的递归思想就是三步走:
原来都在A柱,辅助B柱,目标C柱
(1)想办法把A柱上的除最底下一个以外的盘借助C柱全部移到 B柱,
(2)把最后剩下的一个盘从A移到C;
(3)把B柱上的盘想办法全部移到C柱;
你或许已经发现我上面用了想办法这个词,而实现这个要求的办法我已经给出,你应该注意到每操作一次,问题的规模都在减小:原来是把N个盘移动到C,我已经转化为N-1个盘的问题,这就是递归的本质;
还有一个故事:
从前有座山,山上有个庙,庙里有个老和尚给小和尚讲故事,讲的内容是:“从前有座山……”
这就是递归了,当然上面的递归是物休止的,但实际应用中递归函数都有出口条件,上面的函数的出口就是n=1了
----------------解决方案--------------------------------------------------------
[IMG]http://www.njcsj.com/bbs2/UploadFile/2006-7/2006725214322952.gif[/IMG][IMG]http://www.njcsj.com/bbs2/UploadFile/2006-7/200672521446957.gif[/IMG]
----------------解决方案--------------------------------------------------------