首页 > 其他 > 详细

分治 + 递归之汉诺塔问题详解

时间:2021-06-13 23:46:32      阅读:23      评论:0      收藏:0      [点我收藏+]

分治 + 递归之汉诺塔问题详解

说明

  1. 分治算法,即分而治之算法,将一个复杂的问题先拆分成许多简单的类似的小模块,对这些简单的小模块进行处理过后,再将这些小模块合并到一起,实现分而治的操作
  2. 汉诺塔是指有三个塔A,B,C,A塔有n个按照顺序排放好的盘子,如何将这n个盘子移动到C塔,大盘子不能放置在小盘子上面,可以借助B塔
  3. 此问题很明显可以使用分治来实现,即将n个判断先拆分为1个盘子,两个盘子的情况
  4. 如果只有一个盘子,则直接将其从A塔移动到C塔
  5. 如果有两个盘子,则先将最上面的盘子移动到B,将下面的盘子移动到C,然后将B的盘子移动到C即可
  6. 如果有两个以上的盘子,可以将最下面的一个看作一个盘,将上面的所有个看作一个盘,即看作两个盘,然后很容易想到两个盘的思路,然后实现即可
  7. 上面的盘如果多余1个,则再递归移动
  8. 源码见下

源码及分析

/**
     * 汉诺塔实现
     *
     * @param n 盘子个数层数
     * @param a 塔a
     * @param b 塔b
     * @param c 塔c
     */

    public static void hanoiTower(int n, char a, char b, char c) {
        //如果只有一个盘子
        if (n == 1) {
            System.out.println(a + "-->" + c);
        } else {
            //如果盘子个数 > 1,则将最下边的一个盘子看作一个,将上边的所有盘子看作一个,递归实现
            //如果上边的盘子个数任然>1,再递归
            //直到上边只有一个盘子

            //第一步,将上面的n-1个盘子从A盘移动到B盘
            hanoiTower(n - 1, a, c, b);
            //第二步再将最小边的盘子移动到C盘
            System.out.println(a + "-->" + c);
            //第三步将B盘的所有盘子全部移动到C盘
            hanoiTower(n - 1, b, a, c);
        }
    }

分治 + 递归之汉诺塔问题详解

原文:https://www.cnblogs.com/mx-info/p/14881468.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!