递归 汉诺塔
汉诺塔:
-
一次只能移动一个,
-
大盘不能叠放到小盘子上面,(不是多次移动多次了)
public class TestDemo {
public static void move(char pos1,char pos2){
System.out.println(pos1 +"-->" +pos2+"");
}
//考虑,起始 途径 终止。honai(起始,途径,终止);
public static void honai(int n,char a,char b,char c){
if(n==1){
move(a,c);
}else {
honai(n-1,a,c,b);
move(a,c);//和n == 1 是相等的。
//
honai(n-1,b,a,c);
}
}
public static void main(String[] args) {
honai(2,'A','B','C');
}
}
对于,基本的汉诺塔问题。
解决递归汉诺塔问题,横向思考,思考公式
从n =2 n = 3 中,画图比较。
公式 : honai(n) = honai(n-1) + 1 +honai(n-1);
公式 n个盘子 = n-1个盘子(n-1个放到临时的柱子上) + 最底下的盘子(1) + n- 1个盘子(之前的n-1个盘子,在临时存放的柱上,开始放)
解释:
起始柱子上把最底盘子上面的盘子,放到临时的柱子,最低的柱子,放到最终的柱子, === 相当于把减去了最底的盘子。(不影响其他条件)。
起始,临时最终的柱子,不都是不变的,可以是A,B,C
在这其中,A柱,是没有充当最终的柱子 。?只看算过 n=2,n=3;的情况。
变种1:有2N个盘子,盘子大小有N种,每种盘子有两个。
变种2:有A和B之间不能直接移动,?N个盘子。