思路
这是一个经典的递归问题,递归问题的解决思路就两点:
- 基线条件:不在调用自身
- 递归条件:调用自身
调用自身的条件很好找,将除了最大的金盘以外的其他盘子移到中间的柱子,再将最大的盘子移动到最后一根柱子上,最后将中间的盘子全部移到最后一根柱子上。简直就是将大象移动到冰箱;
不在调用自身的条件也很简单,每一个起始柱子上的盘子移动完了就可以结束了
于是有
private void moveTower(int height, String towerFirst, String towerMiddle, String towerLast) {
if (height < 1) {
return;
}
moveTower(height - 1, towerFirst, towerLast, towerMiddle); // 将 n-1 个盘子移到中间柱子上
moveDisk(height, towerFirst, towerLast); // 将最大的盘子移到最后一个柱子上
moveTower(height - 1, towerMiddle, towerFirst, towerLast); // 将中间的n-1 个盘子移动到最后一个柱子上
}
private void moveDisk(int height, String fromTower, String toTower) {
System.out.println((String.format("move disk %s from %s to %s", height, fromTower, toTower)));
}
代码
接下来就是记录每根柱子上有哪些盘子
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class recursion {
public static void main(String[] args) {
HanoTowel hanoTowel = new HanoTowel(5, "tower1", "tower1", "tower2", "tower3");
hanoTowel.start2move();
}
}
class HanoTowel {
int height;
String tower1;
String tower2;
String tower3;
static List<Integer> towerFirst = new ArrayList<>();
static List<Integer> towerMiddle = new ArrayList<>();
static List<Integer> towerLast = new ArrayList<>();
static HashMap<String, List<Integer>> towers = new HashMap<>();
public HanoTowel(int height, String hasDiskTower, String tower1, String tower2, String tower3) {
this.height = height;
this.tower1 = tower1;
this.tower2 = tower2;
this.tower3 = tower3;
towers.put(tower1, towerFirst);
towers.put(tower2, towerMiddle);
towers.put(tower3, towerLast);
for (int i = height; i > 0; i--) {
towers.get(hasDiskTower).add(i);
}
}
public void start2move(){
moveTower(height, tower1, tower2, tower3);
}
private void moveTower(int height, String towerFirst, String towerMiddle, String towerLast) {
if (height < 1) {
return;
}
moveTower(height - 1, towerFirst, towerLast, towerMiddle);
moveDisk(height, towerFirst, towerLast);
moveTower(height - 1, towerMiddle, towerFirst, towerLast);
}
private void moveDisk(int height, String fromTower, String toTower) {
towers.get(toTower).add(height);
towers.get(fromTower).remove(towers.get(fromTower).size() - 1);
System.out.println((String.format("move disk %s from %s to %s", height, fromTower, toTower)));
System.out.println(towers);
}
}