分治 + 递归之汉诺塔问题详解
Posted mx_info
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治 + 递归之汉诺塔问题详解相关的知识,希望对你有一定的参考价值。
分治 + 递归之汉诺塔问题详解
说明
- 分治算法,即分而治之算法,将一个复杂的问题先拆分成许多简单的类似的小模块,对这些简单的小模块进行处理过后,再将这些小模块合并到一起,实现分而治的操作
- 汉诺塔是指有三个塔A,B,C,A塔有n个按照顺序排放好的盘子,如何将这n个盘子移动到C塔,大盘子不能放置在小盘子上面,可以借助B塔
- 此问题很明显可以使用分治来实现,即将n个判断先拆分为1个盘子,两个盘子的情况
- 如果只有一个盘子,则直接将其从A塔移动到C塔
- 如果有两个盘子,则先将最上面的盘子移动到B,将下面的盘子移动到C,然后将B的盘子移动到C即可
- 如果有两个以上的盘子,可以将最下面的一个看作一个盘,将上面的所有个看作一个盘,即看作两个盘,然后很容易想到两个盘的思路,然后实现即可
- 上面的盘如果多余1个,则再递归移动
- 源码见下
源码及分析
/**
* 汉诺塔实现
*
* @param n 盘子个数层数
* @param a 塔a
* @param b 塔b
* @param c 塔c
*/
public static void hanoiTower(int n, char a, char b, char c) {
//如果只有一个盘子
if (n == 1) {
System.out.println(a + "-->" + c);
} else {
//如果盘子个数 > 1,则将最下边的一个盘子看作一个,将上边的所有盘子看作一个,递归实现
//如果上边的盘子个数任然>1,再递归
//直到上边只有一个盘子
//第一步,将上面的n-1个盘子从A盘移动到B盘
hanoiTower(n - 1, a, c, b);
//第二步再将最小边的盘子移动到C盘
System.out.println(a + "-->" + c);
//第三步将B盘的所有盘子全部移动到C盘
hanoiTower(n - 1, b, a, c);
}
}
以上是关于分治 + 递归之汉诺塔问题详解的主要内容,如果未能解决你的问题,请参考以下文章