递归的高级应用
1. 汉诺塔的问题
所有的盘子刚开始都放在塔座A上,要求将所有的盘子从塔座A移动到塔座C上,每次只能移动一个盘子,任何盘子不能放在比自己小的盘子上。
2. 移动子树
例:起始五个盘子在A,中间为B,需要移到C;可以首先将上边四个移动到B,则A就剩一个,只需一步A→C;问题变为起始四个盘子在B,中间为A,需要移动到C;可以先考虑把上边三个盘子移动到A,则B就剩一个,只需一步B→C;问题变为起始三个盘子在A,中间为B,需要移动到C。。。最终一个盘子在A,中间为B,需要移动到C,只需一步A→C。
3. 递归解决
汉诺塔递归
public class HanoiTower {
/*
* 移动盘子
* topN:移动的盘子数
* from:起始塔座
* inter:中间塔座
* to:目标塔座
*/
public static void doTower(int topN,char from,char inter,char to){
if(topN==1){
System.out.println("盘子1,从"+from+"塔座到"+to+"塔座");
}else{
doTower(topN-1,from,to,inter);
System.out.println("盘子"+topN+",从"+from+"塔座到"+to+"塔座");
doTower(topN-1,inter,from,to);
}
}
}
测试:
public class TestHanoiTower {
public static void main(String[] args) {
// TODO Auto-generated method stub
HanoiTower.doTower(3, 'A', 'B', 'C');
}
}