美文网首页
栈与递归的实现 -- 汉诺塔

栈与递归的实现 -- 汉诺塔

作者: 半亩房顶 | 来源:发表于2018-07-26 18:12 被阅读13次

    第三章第三节 栈与递归的实现
    栈大家都熟悉,先进后出,栈顶在下,栈底在上,添加元素会栈底位置增加
    栈的特性决定了它在处理一些特殊情况的时候很占优势,例如,括号匹配,这节重点 - 递归

    汉诺塔相信大家都很熟悉,规则很简单,目的就是将x上的三个饼插到z上,大饼不能在小饼上面,一次只能移动一个饼。如图:


    灵魂画师之汉诺塔

    二话不说就是一个算法

    void hanoi (int n, char x, char y, char z) {
        //函数意义:将塔座x上按直径从小到大且自上而下编号为1-n 的n个圆盘按规则搬至z,y做辅助
        if(n == 1) {
            move(x, 1, z);
        } else {
            hanoi(n-1, x, z, y);
            move(x, n, z);
            hanoi(n-1, y, x, z);
        }
    }
    

    汉诺塔的递归其实挺简单的,但是它就是实实在在的对于递归核心思想的考验 - 如何设计递归?
    我认为递归的核心在于1、如何将问题一层层剥开;2、剥开到最后是一个最简单的操作。

    我对于汉诺塔的递归思路是这样的:

    • 汉诺塔目的是将整个塔转移,而这个塔每少一层,就是对于问题的一层简化,直至最终只剩下一层,这个时候,汉诺塔就成为了最简单的一次操作了。所以先定下最基本操作,把“最上的某1层”从“起点”挪到“目的地”。
    • 然后来看递归体如何设计,这个就是需要了解汉诺塔的规则了,汉诺塔不能同时挪动多个,而且只能把小的放在大的上面,而我们有一个辅助塔座可以使用。这时如何一层层剥开这个问题的答案已经出来了,就是我们每次转移一层的时候,将这一层跟其上的所有层分离开,如此完成问题的一层层剥离。so,递归体就是,借助另外的那个塔座作辅助,将要挪动的那一层上面的所有层先转移到辅助塔座,然后转移最下层到目的塔座,然后再将辅助塔座上的那几层转移到目的塔座。

    emmm,大致就是这样了,希望我说清楚了,如果没说清的话,溜了溜了~

    相关文章

      网友评论

          本文标题:栈与递归的实现 -- 汉诺塔

          本文链接:https://www.haomeiwen.com/subject/dfbymftx.html