一.分治算法
1.分治算法介绍
"分而治之",将一的大问题分解成n个独立的小问题,一直分到每个小问题可以单独求解,每个小问题的题解合并起来就是大问题的解
2.分治算法步骤
分治算法在每一层递归有如下三个步骤
I.分解:将原问题分解成若干个规模较小,相互独立,与原问题形式相同的子问题
II.解决:若干个规模较小的子问题能解则解,否则递归解各个子问题
III.合并:将各个子问题的解合并为原问题的解
二.解决汉诺塔问题
1.解决思想
对汉诺塔问题使用分治算法,在A,B,C三个柱子上,有n个圆盘.可以将n个圆盘拆分成上下两个部分,下部分1个盘,上部分n-1个盘.将上部分从A移到B,将下部分从A移到C,将上部分从B移到C.
但是n-1个盘如何移动呢?若n-1=1则直接移动,若大于1则重复分上下部分移动
2.代码实现
public class Test {
public static void main(String[] args) {
DAC.hanoiTower(3,'A','B','C');
}
}
class DAC{
private static int count = 0;//记录次数
/**
*
* @param num 表示第n个盘
* @param a 表示a柱子
* @param b b柱子
* @param c c柱子
*/
public static void hanoiTower(int num,char a, char b,char c){
if(num == 1){
System.out.println(++count+": 第"+num+"个盘从"+a+"移到"+c);//表示移动操作
}else {
hanoiTower(num-1,a,c,b);//将上部分从a移动到b
System.out.println(++count+": 第"+num+"个盘从"+a+"移到"+c);//将下部分从a移动到c
hanoiTower(num-1,b,a,c);//将上部分从b移动到c
}
}
}