日撸java 三百行 (day 16 )Hanoi 塔问题

游戏规则:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要将A杆子上的圆盘复刻到C上,并且一次只能移动一个圆盘。

比较经典的算法,基本都知道

分析:

1:当A上圆盘数n=1时,直接放入C即可

2:当A上圆盘数n>1时,需要借助辅助杆B

        1)n=2,时

        2)n>2时,只需将上面看成一个整体,问题就会回归到上面,由于一次只能移动一个,所以上面的整体需要递归处理。

package com.day16;

/**
 * Hanoi tower.
 */
public class Hanoi {

    /**
     *********************
     * Move a number of plates.
     *
     * @param paraSource
     *            The source pole.
     * @param paraIntermediary
     *            The intermediary pole.
     * @param paraDestination
     *            The destination pole.
     * @param paraNumber
     *            The number of plates.
     *********************
     */
    public static void hanoi(char paraSource, char paraIntermediary, char paraDestination,
                             int paraNumber) {
        if (paraNumber == 1) {
            System.out.println(paraSource + "->" + paraDestination + " ");
            return;
        } // Of if

        hanoi(paraSource, paraDestination, paraIntermediary, paraNumber - 1);
        System.out.println(paraSource + "->" + paraDestination + " ");
        hanoi(paraIntermediary, paraSource, paraDestination, paraNumber - 1);
    }// Of hanoi

    /**
     *********************
     * The entrance of the program.
     *
     * @param args
     *            Not used now.
     *********************
     */
    public static void main(String args[]) {
        hanoi('a', 'b', 'c', 3);
    }// Of main
}// Of class Hanoi

虽然代码超级简单,但是要理清还是要费点功夫。代码分析:

前三个参数分别代表不同的杆子,最后一个参数代表初始A杆子上的圆盘数;递归的出口即最简单的 n =1的情况,此时需要进行操作,这里只模拟位置的移动。并且我们通过调换参数的位置,即可用相同的语句实现不同的移动操作,这一点我感觉是挺厉害的,并且参数位置的不同还能控制其奇数次递归与偶数次递归的细微差别, 只能说不愧是经典算法,简化到不能再简化。下面是n=2,n=3的运行结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值