递归算法——汉诺塔问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzp961224/article/details/60337440

题目: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动?


解答过程:

import java.util.Scanner;

public class 汉诺塔 {
	static long count;

	static void hanoi(int n, char a, char b, char c) {
		if (n == 1) {
			count++;
			System.out.println("第" + count + "次移动:\t圆盘从" + a + "棒移动到" + c + "棒");
		} else {
			hanoi(n - 1, a, c, b);
			count++;
			System.out.println("第" + count + "次移动:\t圆盘从" + a + "棒移动到" + c + "棒");
			hanoi(n - 1, b, a, c);
		}
	}

	public static void main(String[] args) {
		int n;
		count = 0;
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		hanoi(n, 'A', 'B', 'C');
		System.out.println("共需要" + count + "步移动");
	}
}
解题思路:
若只有一个圆盘,则直接从a->c,若大于1,则圆盘从a->b,再从b->c

递归的思想在于,把大于1以外的所有圆盘想象成一个小圆盘,小圆盘需要先从a->b,等大圆盘从a->c之后,再从b->c

猜你喜欢

转载自blog.csdn.net/zzp961224/article/details/60337440