读书人

递归思想 汉诺塔的有关问题

发布时间: 2012-09-20 09:36:50 作者: rapoo

递归思想 汉诺塔的问题

package endual;public class Main {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubint n = 2; //一共有多少个char a = 'A' ; //开始的点char b = 'B' ; //中间的点char c = 'C' ; //结束的点hanNoi(n,a,b,c) ;}/** *  * 这个问题上有一个简单的解法。假设塔座上a, b, c排成一个三角形,a-->b-->-->a构成 * 一顺时针循环。在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘移动到顺时针方向的 * 下一个底座上;若是偶数次的话,那么保存最小的圆盘不懂,而在其他两个塔座之间将 * 较小的圆盘移动到另个塔上去 *  *  * 其中,hanNoi(n,a,b,c)表示将塔座a上自下而上,由大到校叠在一起的n个圆盘依次移动 * 规则移动到塔座b上并扔按同样顺序叠放。在一定过程中,以塔座作为辅助塔座, * move表示从a移动到b的方法 *  *  */private static void hanNoi(int n, char a, char b, char c) {        if (n == 1) {        //如果就剩下了,那么只有一种情况了,它要么移动到B,要么移动到C        //我们认为移动到C才是目标,因为如果移动到B和移动到C都是可行的        move (a, c) ;         return ;                }                //首先吧n-1个移动到b去        hanNoi(n-1,a,c,b) ; //将底盘最上面n-1个盘子从a移动到b去        move(a,c) ;        //将底盘最下面一个从a移动到c中        hanNoi(n-1,b,a,c) ; //然后将n-1个盘子从b移动到c去,这样就完成了整个操作了}private static void move(char a, char c) {System.out.println(a + "------------->" + c) ;}}
?

读书人网 >编程

热点推荐