/*
有三根杆子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);
}
}
汉诺塔问题java
猜你喜欢
转载自blog.csdn.net/weixin_42443419/article/details/88959369
今日推荐
周排行