汉诺塔问题java

/*
有三根杆子A,B,C。A杆上有 N 个 (N >= 1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

每次只能移动一个圆盘;
大盘不能叠在小盘上面。

提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

如何移:
N=1:
	A --> C
N=2:
	A --> B
	A --> C
	B --> C
N=3:
	A --> C
	A --> B
	C --> B
	A --> C
	B --> A
	B --> C
	A --> C
N=4
...

递归:
	1. 边界条件
		N=1;
	2. 递推关系
		把N-1个盘子从A移动到B杆
		把盘子从A移动到C杆
		把N-1个盘子从B移动到C杆
		
问题:最少要移动多少次?
	1. 边界条件
		N=1, count(1)=1;
	2. 递推关系
		N=n, count(n) = 2 * count(n-1) + 1;
		
问题:如何移
	1. 边界条件
		N=1;
	2. 递推关系
		把N-1个盘子从A移动到B杆
		把盘子从A移动到C杆
		把N-1个盘子从B移动到C杆
	
	如何定义方法呢?
		返回值:void
		参数列表:int n, char start, char middle, char end;
*/
import java.util.Scanner;
class RecursionDemo4 {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入盘子的个数:");
		int n = sc.nextInt();
		int count = count(n);
		System.out.println("最少需要挪动这么多次:" + count);
		hanoi(n, 'A', 'B', 'C');
	}
	
	public static int count(int n) {
		// 边界条件
		if(n == 1) {
			return 1;
		}
		return 2 * count(n-1) + 1;
	}
	
	public static void hanoi(int n, char start, char middle, char end) {
		// 边界条件
		if(n == 1) {
			System.out.println(start + " --> " + end);
			return ;
		}
		// 把n-1个盘子从start开始,经过end,挪到middle
		hanoi(n-1, start, end, middle);
		// 把最后一个盘子从start挪到end
		System.out.println(start + " --> " + end);
		// 把n-1个盘子从middle经过start挪到end
		hanoi(n-1, middle, start, end);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42443419/article/details/88959369