java汉诺塔问题(递归)

我采用的是逆推的思想,在最后一块当前是单独的一部分,其他为另外一部分,无论多少我们都可以分为两部分。

当只有一个盘子的时候
我们可以直接把盘子移动到C盘

当只有两个盘子的时候
在这里插入图片描述

当有两个的时候我们可以这样实现最短路径到C盘

			//上面部分的处理方式
			move(num-1, a, c, b);
			//借助C盘进行转移到B盘,但是因为我们上面部分只有一块,
			//所以我们不用借助C盘了,可以直接转移到B盘
            // (2) 这个是移动下面部分的
            System.out.println(a + "->" + c);
            // (3) 再把 b塔的所有盘, 移动到 c,借助a塔
            move(num - 1, b, a, c);

当盘子有三个的时候
在这里插入图片描述
先分成两部分,优先把最下面的定位到C盘,然后在处理上面部分

处理上面两个时,因为在上面的时候我们最后移动到B盘,我们以B盘为主,那我们就要以C盘为辅进行转移。
三个也可以像二个一样进行分析。多个也一样。

// num表示要移动的个数, a, b, c 分别表示A塔, B塔, C塔
    public void move(int num, char a, char b, char c) {
        // 如果只有一个盘 num = 1
        if(num == 1) {
            System.out.println(a + "->" + c);
        } else {
            // 如果有多个盘,可以看成两个,最下面的和上面的所有盘(num - 1)
            // (1) 先移动上面所有的盘到 b, 借助 c
            move(num-1, a, c, b);
            // (2) 把最下面的这个盘,移动到 c
            System.out.println(a + "->" + c);
            // (3) 再把 b塔的所有盘, 移动到 c,借助a塔
            move(num - 1, b, a, c);
        }

    }

主要思想就是分成两部分,这样就很好分析了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值