• 汉诺塔游戏


    1. 汉诺塔  

      汉诺塔(港台:河内塔)是根据一个传说形成的数学问题:

      有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

      1.   每次只能移动一个圆盘;
      2.   大盘不能叠在小盘上面。

      提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

      问:如何移?最少要移动多少次?

    2.使用递归解法

      Python:

    def move(n, a = "A", b="B", c="C"):
    if not isinstance(n, (int)): #判断是否整数
    print("盘子个数为正整数!")
    return
    if n <= 0:
    print("盘子个数为正整数!") #
    return
    elif n == 1:
    print(a, "-->", c)
    else:
    move(n-1, a, c, b) #将a柱子上的2层以上的全移到b柱子上边
    move(1, a, b, c) #将a柱子上的最下面一层移到c柱子上边
    move(n-1, a, b, c) #将b柱子上的所有的盘子移到c柱子上边

    if __name__ == '__main__':
    move(4, "A", "B", "C")
    print("===============")
    move(5.5)
    print("===============")
    print("请输入盘子的个数:")
    n = input()
    move(int(n))

      Java:

    public class Test {
    
        //汉诺塔递归
        public static void move(int n, String a, String b, String c){
            if (n <= 0){
                System.out.println("盘子个数为正整数!");
                return;
            }else if (n == 1){
                System.out.println(a + "-->" + c);
            }else {
                move(n-1, a, c, b);
                move(1, a, b, c);
                move(n-1, b,a ,c);
            }
        }
    
        public static void main(String[] args) {
            move(3, "A", "B", "C");
        }
    
    }
    

     

    3.汉诺塔游戏中递归的理解(知乎大神无处不在)

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

    对递归的理解的要点主要在于放弃!

    放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

    想象你来到某个热带丛林,意外发现了十层之高的汉诺塔。正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔。他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱。

    你灵机一动,问道:“你该不会有个兄弟叫三傻吧?”
    “对对,老爷你咋知道的?他会搬一到三号盘。“
    ”那你去把他叫来,我不需要你了。“
    于是三傻来了,他也带着个草帽,上面有个3字。

    你说:”三傻,你帮我把头三个盘子移到c柱吧。“
    三傻沉吟了一会,走进树林,你听见他大叫:”二傻,出来帮我把头两个盘子搬到C!“

    由于天气炎热你开始打瞌睡。朦胧中你没看见二傻是怎么工作的,二傻干完以后,走入林中大叫一声:“老三,我干完了!”

    三傻出来,把三号盘从A搬到B,然后又去叫二傻:“老二,帮我把头两个盘子搬回A!”

    余下的我就不多说了,总之三傻其实只搬三号盘,其他叫二傻出来干。最后一步是三傻把三号盘搬到C,然后呼叫二傻来把头两个盘子搬回C

    事情完了之后你把三傻叫来,对他说:“其实你不知道怎么具体一步一步把三个盘子搬到C,是吧?”

    三傻不解地说:“我不是把任务干完了?”

    你说:“可你其实叫你兄弟二傻干了大部分工作呀?”

    三傻说:“我外包给他和你屁相干?”

    你问到:“二傻是不是也外包给了谁?“

    三傻笑了:“这跟我有屁相干?”

    你苦苦思索了一夜,第二天,你走入林中大叫:“十傻,你在哪?”

    一个头上带着10号草帽的人,十傻,应声而出:“老爷,你有什么事?”

    “我要你帮把1到10号盘子搬到C柱“

    “好的,老爷。“十傻转身就向林内走。

    “慢着,你该不是回去叫你兄弟九傻吧“

    “老爷你怎么知道的?“

    “所以你使唤他把头九个盘子搬过来搬过去,你只要搬几次十号盘就好了,对吗?“

    “对呀!“

    “你知不知道他是怎么干的?“

    “这和我有屁相干?“

    你叹了一口气,决定放弃。十傻开始干活。树林里充满了此起彼伏的叫声:“九傻,来一下!“ “老八,到你了!““五傻!。。。“”三傻!。。。“”大傻!“

    你注意到大傻从不叫人,但是大傻的工作也最简单,他只是把一号盘搬来搬去。

    若干年后,工作结束了。十傻来到你面前。你问十傻:“是谁教给你们这么干活的?“

    十傻说:“我爸爸。他给我留了这张纸条。”

    他从口袋里掏出一张小纸条,上面写着:“照你帽子的号码搬盘子到目标柱。如果有盘子压住你,叫你上面一位哥哥把他搬走。如果有盘子占住你要去的柱子,叫你哥哥把它搬到不碍事的地方。等你的盘子搬到了目标,叫你哥哥把该压在你上面的盘子搬回到你上头。“

    你不解地问:“那大傻没有哥哥怎么办?“

    十傻笑了:“他只管一号盘,所以永远不会碰到那两个‘如果’,也没有盘子该压在一号上啊。”

    但这时他忽然变了颜色,好像泄漏了巨大的机密。他惊慌地看了你一眼,飞快地逃入树林。

    第二天,你到树林里去搜寻这十兄弟。他们已经不知去向。你找到了一个小屋,只容一个人居住,但是屋里有十顶草帽,写着一到十号的号码。

    认真是我们参与这个社会的方式,认真是我们改变这个社会的方式!
  • 相关阅读:
    python-发送邮件
    python-操作Excel表格
    PLSQL 删表 恢复
    ajax
    List<Object>
    Java String 转成 二位数组
    js-sequence-diagrams > 时序图
    Highcharts › 自由绘图
    高德地图 JS API (jsp + miniui(子页面数据返回父页面并设值) + 单个点标记 + 点标记经纬度 + 回显 + 限制地图显示范围+搜索)
    突然奋斗的开发
  • 原文地址:https://www.cnblogs.com/mufengforward/p/8990890.html
Copyright © 2020-2023  润新知