每天作死一道题——汉诺塔(c)

刚刚看到一句话很有意思
保存下来:对递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。

/*************************
       递归.汉诺塔
*************************/

# include <stdio.h>
//这里不需要返回值
void ta (int n, char A, char B, char C)
{
    /*只剩一个的时候
          直接从原上的移到放
      否则
          将原柱子上的n-1个移到放柱子最后到借的柱子
          直接将原柱子上的由原到放
          最后将借柱子上的n-1个到原柱子,然后到放柱子
    */
    if (n==1)
    printf ("将标号为%d上的盘子从%c移到%c\n", n, A, C);
    else
    {
        ta (n-1, A,C,B);
        printf ("将标号为%d上的盘子从%c移到%c\n", n, A, C);
        ta (n-1, B, A, C);
    }
}

int main ()
{
    int n;//层数

    scanf ("%d", &n);
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';

    ta(n, 'A','B','c');

    return 0;
}
然后刚刚在知乎上看到一篇回答,理解汉诺塔很有帮助,贴下面:


   想象你来到某个热带丛林,意外发现了十层之高的汉诺塔。正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔。
   他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱。你灵机一动,问道:“你该不会有个兄弟叫三傻吧?”“对对,老爷你咋知道的?他会搬一到三号盘。“”那你去把他叫来,我不需要你了。“于是三傻来了,他也带着个草帽,上面有个3字。你说:”三傻,你帮我把头三个盘子移到c柱吧。“三傻沉吟了一会,走进树林,你听见他大叫:”二傻,出来帮我把头两个盘子搬到C!“由于天气炎热你开始打瞌睡。朦胧中你没看见二傻是怎么工作的,二傻干完以后,走入林中大叫一声:“老三,我干完了!”三傻出来,把三号盘从A搬到B,然后又去叫二傻:“老二,帮我把头两个盘子搬回A!”余下的我就不多说了,总之三傻其实只搬三号盘,其他叫二傻出来干。
    若干年后,工作结束了。十傻来到你面前。你问十傻:“是谁教给你们这么干活的?“十傻说:“我爸爸。他给我留了这张纸条。”他从口袋里掏出一张小纸条,上面写着:“照你帽子的号码搬盘子到目标柱。如果有盘子压住你,叫你上面一位哥哥把他搬走。如果有盘子占住你要去的柱子,叫你哥哥把它搬到不碍事的地方。等你的盘子搬到了目标,叫你哥哥把该压在你上面的盘子搬回到你上头。“你不解地问:“那大傻没有哥哥怎么办?“十傻笑了:“他只管一号盘,所以永远不会碰到那两个‘如果’,也没有盘子该压在一号上啊。”但这时他忽然变了颜色,好像泄漏了巨大的机密。他惊慌地看了你一眼,飞快地逃入树林。第二天,你到树林里去搜寻这十兄弟。他们已经不知去向。你找到了一个小屋,只容一个人居住,但是屋里有十顶草帽,写着一到十号的号码。

转自知乎如何理解汉诺塔的递归? - Fireman A的回答 - 知乎
https://www.zhihu.com/question/24385418/answer/257751077
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值