`
endual
  • 浏览: 3506704 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

递归思想 汉诺塔的问题

 
阅读更多

package endual;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int 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) ;
		
	}

}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics