分治算法介绍及解决汉诺塔问题java

一.分治算法

1.分治算法介绍

        "分而治之",将一的大问题分解成n个独立的小问题,一直分到每个小问题可以单独求解,每个小问题的题解合并起来就是大问题的解

2.分治算法步骤

分治算法在每一层递归有如下三个步骤

I.分解:将原问题分解成若干个规模较小,相互独立,与原问题形式相同的子问题

II.解决:若干个规模较小的子问题能解则解,否则递归解各个子问题

III.合并:将各个子问题的解合并为原问题的解

二.解决汉诺塔问题

1.解决思想

        对汉诺塔问题使用分治算法,在A,B,C三个柱子上,有n个圆盘.可以将n个圆盘拆分成上下两个部分,下部分1个盘,上部分n-1个盘.将上部分从A移到B,将下部分从A移到C,将上部分从B移到C.

但是n-1个盘如何移动呢?若n-1=1则直接移动,若大于1则重复分上下部分移动

2.代码实现

public class Test {
    public static void main(String[] args) {
        DAC.hanoiTower(3,'A','B','C');
    }
}
class DAC{
    private static int count = 0;//记录次数

    /**
     * 
     * @param num 表示第n个盘
     * @param a 表示a柱子
     * @param b b柱子
     * @param c c柱子
     */
    public static void hanoiTower(int num,char a, char b,char c){
        if(num == 1){
            System.out.println(++count+": 第"+num+"个盘从"+a+"移到"+c);//表示移动操作
        }else {
            
            hanoiTower(num-1,a,c,b);//将上部分从a移动到b
            
            System.out.println(++count+": 第"+num+"个盘从"+a+"移到"+c);//将下部分从a移动到c
            
            hanoiTower(num-1,b,a,c);//将上部分从b移动到c
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值