大白话讲hanoi java

首先题目就不多重复了,直接上代码

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);

最后:递归的思想就是递和归  这个题目的递挺好理解的  归就挺模糊的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值