分治算法(Java)

想必大家通过算法的名字就已经明白了,这个算法的过程,一个是分,一个是治。那么我为什么要使用这种算法呢?因为当前的问题是我们使用现有的方法是解决不了的,所以我们需要将一个复杂的问题分成两个或者是更多个相同或相似的子问题,然后再一我们已有的方法去解决。因此,我们要先分,再治,最后再合并。

可能大家觉得有一点抽象,这个算法的本质就是我们将复杂的问题简单化使用辅助工具来解决。在这个算法中,我们的工具,那就是递归。
下面我给大家讲解一下这个算法的典型例题汉诺塔。

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

在这道题中,我们可以看出,需要将最左边的盘子全部移到最右边,而且要与最左边的盘子保持一样的顺序,那么这里就会体现到我们分治算法的思想,分而治之。而中间的b就是我们解决这道题的重要途径,我们需要利用b来作为一个中间的桥梁。我们拿三个盘子举例子,首先我们需要将第一个盘子放到c上,然后再将第二个盘子放到b上,再将第一个盘子也放到b上,然后将第三个盘子放到c上,然后将第一个盘子放到a上,再将第二个盘子放到c上,再将第一个盘子放到c上。代码如下:

@Test
    public void test(){
        hanNouTower(3,'a','b','c');
    }
    public void hanNouTower(int count,char a ,char b, char c){
        if(count==1){
            System.out.println("第1个盘子从"+a+"移动到了"+c);
        }else{
            hanNouTower(count-1,a,c,b);
            System.out.println("第"+count+"个盘子从"+a+"移动到了"+c);
            hanNouTower(count-1,b,a,c);
        }
    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜不修

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值