zoukankan      html  css  js  c++  java
  • 如何理解汉诺塔的递归?

    作者:魏闪
    链接:https://www.zhihu.com/question/24385418/answer/107705695
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    一个环:
    Step1.将最大的环从A移动到C
    A -> C

    两个环:
    Step1.把除了最大的环之外的环,从A移动到B
    A -> B
    Step2.将最大的环从A移动到C
    A -> C
    Step3.把除了最大的环之外的环,从B移动到C
    B -> C

    三个环:
    Step1.把除了最大的环之外的环,从A移动到B
    A -> C
    A -> B
    C -> B
    Step2.将最大的环从A移动到C
    A -> C
    Step3.把除了最大的环之外的环,从B移动到C
    B -> A
    B -> C
    A -> C

    所以其实是这样抽象成三个步骤的~
    这个时候,可以放张图了
    (a)是初始状态,也就是递归的起点,我们假设n=4, move(4,A,B,C)还是请参考现在最高的分的代码哈~写这个是帮助大家更清楚那个让人压力大的(“抽象”)两个字,哈哈
    <这个函数要实现的功能是把n个环从A按照一定的规则,借助B,移动到C>
    (b)是step1完成的时候的状态,已经将所有的n-1,这里也就是3个环从A挪到了B
    <第一处递归,move(n-1,A,C,B) 这个函数要实现将n-1个环从A,借助C,移动到B>
    (c)是step2,此时需要将第n个,也就是第四个最大的环从A挪到C
    <move(1,A,B,C),或者干脆直接print("A -> C")>
    (d)是step3,此时需要将B上面的n-1个环从B挪到C<第二处递归>
    <第二处递归,move(n-1,B,A,C) 这个函数要实现将n-1个环从B,借助A,移动到C>
  • 相关阅读:
    JavaScript继承详解 转
    Chinese Consumer and Websites
    【转载】C#防SQL注入过滤危险字符信息
    记一次在数据库中查询:“包含”或者“仅包含”某些商品的订单的方法
    IE 6 position: relative + li 问题
    【转】c# 位操作
    基于asp.net MVC的无刷新文件上传
    C++ 类继承内存布局
    美杜杉 主动防御最新版
    [转]COM 连接点
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/8807616.html
Copyright © 2011-2022 走看看