递归,汉诺塔

 

汉诺塔问题寻常解

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...语句就不可能执行。
而它一旦开始执行了,就说明上面的递归调用结束了。这也就是说,你所看到的第一行,其实是最后一次递归调用后所输出的,而最后一行才是第一次调用(没有递归)时的输出!

posted on 2017-06-13 16:54  CNundefined  阅读(180)  评论(0编辑  收藏  举报