首先题目就不多重复了,直接上代码
public class Hanoi2 {
static int i;
public static void hanoi(int n,String location1,String location2,String location3) {
i++;
if (n == 1) {
System.out.println(location1+"->"+location3);
}else{
**hanoi(n-1,location1,location3,location2);**
System.out.println(location1+"->"+location3);
**hanoi(n-1,location2,location1,location3);**
}
}
public static void main(String[] args) {
hanoi(5,"A","B","C");
System.out.println("一共"+i+"次");
}
}
思路:首先假设有n个盘子,那么先是n-1由A移动到B,第n由A移动到C,最后一步肯定是n-1由B移动到C
然后n-1如和由A移动到B?把n-1看成m,A看成A,B看成C,C看成B,和上一步是一样的,只不过数目变了,B和C的逻辑位置上改变了
然后我们在说说第一个加粗的地方,n-1对应的m,location1还是A,location2由之前的location2变成了location3,location3(目标柱)又location3变成了location2对应我上面说的对吧。
最后加粗的也是一样,只是数目和目标柱变了是由location2(B成为起始点),location3(C)成为了目标点
总结:之前加粗的地方我总是有点看不明白,后面想一想也就是换一个起始点和终点的思路,然后递归里面机器再去换起始点和终点。我们的sout函数说白了就是一个move函数。最后递归的终结条件是if语句n==1
可以看看n=5和n=6奇数和偶数的区别,当n=5 最后一步是由A->C,n=6, 最后一步是B->C。这里你要想到底机器是怎么分的有点难我想不出,但是可以换个角度想一想:当剩下最后一个盘子的时候肯定是在A或B,机器调用的时候只不过是把起始柱子改成了A或者B。在n一开始等会1的时候就在location1(A)而不再location2(B),所以是System.out.println(location1+"->"+location3);
最后:递归的思想就是递和归 这个题目的递挺好理解的 归就挺模糊的