zoukankan      html  css  js  c++  java
  • 递归,汉诺塔

    汉诺塔问题寻常解

    var hanoi = function(disc,src,aux,dst){
        console.log('-------')
        if(disc>0){
            hanoi(disc-1,src,dst,aux)
            document.write("Move disc " + disc + " from " + src + " to " + dst + "</br>")
            hanoi(disc-1,aux,src,dst)
        }
    }
    hanoi(3,"Src","Aux","Dst")

    打开页面得到的结果是
    Move disc 1 form Src to Dst
    Move disc 2 form Src to Aux
    Move disc 1 form Dst to Aux
    Move disc 3 form Src to Dst
    Move disc 1 form Aux to Src
    Move disc 2 form Aux to Dst
    Move disc 1 form Src to Dst

    分析:

    递归就是自己调用自己,然后再次调用自己……这样就必然产生一个层次问题,就是每次调用者都是自己的上级,而不是最初一开始的那次调用,这样的话,当递归的条件不符合,需要退出时,是退出到自己的上一级调用者,而不是直接退出整个函数的!
    就好比你从一楼上到五楼,是要一二三四五这样逐楼上升的,下来的时候也是要五四三二一这样逐楼下降的,不可能从五楼直接跳到一楼的。
    具体到你这段代码,当输出第一行时,hanoi函数已经递归调用多次(或者说多层)了,这是因为当disc>0时,函数运行的第一条语句就是递归调用,这样的话,只要disc>0,下面的那条document.write...语句就不可能执行。
    而它一旦开始执行了,就说明上面的递归调用结束了。这也就是说,你所看到的第一行,其实是最后一次递归调用后所输出的,而最后一行才是第一次调用(没有递归)时的输出!
  • 相关阅读:
    网络通信协议八之(传输层)TCP协议详解
    MongoDB数据库连接失败
    Flask web开发之路十四
    Flask web开发之路十三
    Flask web开发之路十二
    Flask web开发之路十一
    Flask web开发之路十
    NEERC 1999 Advertisement /// oj22646
    upper_bound() lower_bound() 用法
    palindrome 回文 /// Manacher算法
  • 原文地址:https://www.cnblogs.com/cnundefined/p/7002174.html
Copyright © 2011-2022 走看看