递归--Java_汉诺塔
背景:
有三根细柱(A、B、C)。A柱上套着5个圆盘。这些圆盘大小各异,按从大到小的顺序自下而上摆放。
现在要把套在A柱上的5个圆盘全部移到B柱上。并且在移动圆盘时遵守下述规则:
- 一次只能移动柱子最上端的一个圆盘。
- 小圆盘上不能放大圆盘。
思考:
- 1个圆盘直接将B;
- 2个圆盘将第1个圆盘搬到C,然后将第2个圆盘搬到B,第一个圆盘再搬到B;
- 3个圆盘将前2个搬到C,然后第3个圆盘搬到B,前2个圆盘搬到B;
- ...
- n个圆盘将前n-1个搬到C,然后第n个圆盘搬到B,前n-1个圆盘搬到B:
f(n-1)--->C
f(n)--->B
f(n-1)--->B
实现:
import java.util.Scanner; public class Hanoi { private static Scanner in; private static int i; public static void main(String[] args) { // TODO Auto-generated method stub in = new Scanner(System.in); System.out.println("请输入需要移动的圆盘的个数:"); int number = in.nextInt(); char start = 'A'; char end = 'B'; char transfer = 'C'; moveDisk(number, start, end, transfer); System.out.println("汉诺塔总共移动的次数:" + i); } public static void moveDisk(int n, char start, char end, char transfer) { if (n > 0) { // 因为小圆盘上不能放大圆盘,n-1块圆盘肯定是在中转站 moveDisk(n - 1, start, transfer, end); // ‘最后一块’放到目的地 System.out.println("第" + n + "个塔移动:" + start + "--->" + end); // 把n-1块送回到目的地 moveDisk(n - 1, transfer, end, start); i++; } } }