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

Posted mx_info

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治 + 递归之汉诺塔问题详解相关的知识,希望对你有一定的参考价值。

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

说明

  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);
        }
    }

以上是关于分治 + 递归之汉诺塔问题详解的主要内容,如果未能解决你的问题,请参考以下文章

递归与分治思想:汉诺塔(递归 && 分治思想)

2017.11.26 计算机算法之分治与递归——汉诺塔

python汉诺塔非递归

分治算法——汉诺塔问题

算法——分治递归解决汉诺塔问题

算法——分治递归解决汉诺塔问题