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

2018-07-26  本文已影响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、剥开到最后是一个最简单的操作。

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

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

上一篇 下一篇

猜你喜欢

热点阅读