zoukankan      html  css  js  c++  java
  • 汉诺塔解题思路

    汉诺塔解题思路

    汉诺塔塔问题符合数学统计归纳,千万别试图去理解n层移动问题(或者说去理解n层递归,人脑真不够用),理解3层汉诺塔问题就行。
    总结起来如下:
    递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

    解题算法

    1. 如果A柱子只剩一个盘子,那么直接移动到C柱子即可
    2. 把 n-1 号盘子移动到缓冲区
    3. 把1号从起点移到终点
    4. 然后把缓冲区的n-1号盘子也移到终点

    解题框架

    /*
    1.要从a到b 那c就是缓冲 move(n-1,from,to,buffer)
    2.要从a到c 那b就是缓冲 move(1,from,buffer,to)
    3.要从b到c 那a就是缓冲 move(n-1,buffer,from,to)
    */
    //汉诺塔移动框架
    void move(n,from,buffer,to){
        if (n == 1) {
            removeTo(from,to);
            return;
        }
        move(n-1,from,to,buffer);
        move(1,from,buffer,to);
        move(n-1,buffer,from,to);
    }
    void removeTo(List<Integer> from, List<Integer> to) {
        to.add(from.remove(from.size() - 1));
    }

    Java代码

    //汉诺塔问题解释https://www.zhihu.com/question/24385418
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        remove(A.size(),A,B,C);
    }
    private void remove(int n, List<Integer> from, List<Integer> buffer, List<Integer> to) {
        //如果A柱子只剩一个盘子,那么直接移动到C柱子即可
        if (n == 1) {
            removeTo(from,to);
            return;
        }
        //1.把 n-1 号盘子移动到缓冲区
        //把A柱子上面的n-1个盘子,借助辅助柱子C,放到柱子B上
        remove(n - 1, from, to, buffer);
        //2.把1号从起点移到终点
        //此时A柱子剩下那个盘子是n个盘子中最大的那个,把他移动到C柱子上
        remove(1, from,buffer,to);
        //3.然后把缓冲区的n-1号盘子也移到终点
        //最后把刚才放在B柱子上的n-1个盘子,借助柱子A辅助,放到柱子C上
        remove(n - 1, buffer, from, to);
    }
    
    private void removeTo(List<Integer> from, List<Integer> to) {
        to.add(from.remove(from.size() - 1));
    }
  • 相关阅读:
    NodeJS系列~第一个小例子,实现了request.querystring功能
    JS~js里实现队列与堆栈
    最新CSS兼容方案
    js传真实地址 C:fakepath
    IE11的变化 navigator.userAgent中不再包含“MSIE”关键字
    看看该死的jquery.form.js的用法,不是个东西
    bootstrap模态框怎么传递参数
    方法的直接调用,反射调用
    IIS 7.5 配置伪静态
    TrippleDESCSPEncrypt 加密解密试试看
  • 原文地址:https://www.cnblogs.com/zincredible/p/13301296.html
Copyright © 2011-2022 走看看