c语言递归问题: 汉诺塔问题:
发布网友
发布时间:2022-06-05 13:21
我来回答
共3个回答
热心网友
时间:2023-11-22 04:52
假设最初有3个盘子,目标是柱子A移到柱子C上,柱子从左到右是A,B,C,我给你说明一下过程:
1.move(2,a,b);move(1,a,c);move(2,b,c);//将2个盘子从A移到B上,再将剩下的1个从A移到C上,最后将2个盘子从B移到C上,就完成了最终的任务。但是,move(2,a,b)和move(2,b,c)这个操作要继续分解。
2.move(2,a,b) <==> move(1,a,c);move(1,a,b);move(1,c,b)
3.move(2,b,c) <==> move(1,b,a,);move(1,b,c);move(1,a,c);
4.最后,合成所有的动作就是:move(1,a,c);move(1,a,b);move(1,c,b);(前三步在完成move(2,a,b)的动作)move(1,a,c);move(1,b,a,);move(1,b,c);move(1,a,c);(后三步在完成move(2,b,c) 的动作)
现在,你拿三本书来验证一下上面的对不对,再体会一下。思考方式就是递归的方式。
一个元操作move(n,x,y,z)是指,把n本书从柱子x移到柱子z,移的过程中要借用柱子y。我的move里面省略了y,是为了表达更清晰。当n>1时,意味着我们要先把上面的n-1个移走(这一操作要继续分解为更小的操作),再最下面的那个最大的移到目标位置,最后再把上面的n-1也移到目标位置(这一操作也要继续分解为更小的操作)。当n=1时,意味着我们可以直接把这1个盘子移到目标位置,此时也就退出了递归。
这里有个细节要体会一下,为什么要先移上面的n-1个,再最后移下面一个大的,因为汉诺塔问题规定,任何时候都必须是大的在下面,小的在上面,对于上面的n-1个,最下在的大盘子就像平地一样,其所在的柱子可以随意使用。反过来,先移上面1个,再移下面的n-1个就是不可行的,因为会有一个柱子变得不可用。
你跟踪下程序,会让你更清晰,注意参数的变化。也可以拿纸画一下。
注意,我们实际演示中的一个移动的动作,程序中就是用printf()这样一句话来表示的。OKAY?
热心网友
时间:2023-11-22 04:52
还好n=3,自己找盘子来个现场演示吧
热心网友
时间:2023-11-22 04:53
这个真不好说明白,真想象不出来,就拿几个盘子演示一下!