递归

汉诺塔问题

Posted by Ruizhi Ma on June 18, 2019

解决思路

所有不管多少个盘子,都可以看成两个盘子,即最后一个盘子,和其他所有盘子,然后都可以拆解为三步:

  1. 将最后一个盘子上面的所有盘子,借助目标柱移动到中间柱子上
  2. 将最后一个盘子移动到目标柱上
  3. 将中间柱上所有盘子,借助初始柱,移动到最后一个柱子上

TestHanoi类

package demo3;

public class TestHanoi {
	
	/*
	 * n为总共盘子的个数
	 * a为第一个柱子
	 * b为中间柱
	 * c为目标柱
	 */
	public static void hanoi(int n, char a, char b, char c){
		//递归的出口
		if(n == 1){
			System.out.println("将第1个盘子从"+a+"移动到"+c);
		}else{
			//递归公式
			//1.将最后一个盘子上面所有的盘子,借助c柱,移动到b柱上
			hanoi(n-1, a, c, b);
			
			//2.将最后一个盘子从a移动到c柱上
			System.out.println("将第"+n+"个盘子从"+a+"移动到"+c);
			
			
			//3.将b柱上的所有盘子借助a柱,移动到c柱上
			hanoi(n-1, b, a, c);
			
		}
	}

	public static void main(String[] args) {
		hanoi(5, 'a', 'b', 'c');
	}

}

运行结果:

将第1个盘子从a移动到c
将第2个盘子从a移动到b
将第1个盘子从c移动到b
将第3个盘子从a移动到c
将第1个盘子从b移动到a
将第2个盘子从b移动到c
将第1个盘子从a移动到c
将第4个盘子从a移动到b
将第1个盘子从c移动到b
将第2个盘子从c移动到a
将第1个盘子从b移动到a
将第3个盘子从c移动到b
将第1个盘子从a移动到c
将第2个盘子从a移动到b
将第1个盘子从c移动到b
将第5个盘子从a移动到c
将第1个盘子从b移动到a
将第2个盘子从b移动到c
将第1个盘子从a移动到c
将第3个盘子从b移动到a
将第1个盘子从c移动到b
将第2个盘子从c移动到a
将第1个盘子从b移动到a
将第4个盘子从b移动到c
将第1个盘子从a移动到c
将第2个盘子从a移动到b
将第1个盘子从c移动到b
将第3个盘子从a移动到c
将第1个盘子从b移动到a
将第2个盘子从b移动到c
将第1个盘子从a移动到c