开发者社区> 问答> 正文

什么是递归算法?

什么是递归算法?

展开
收起
知与谁同 2018-07-15 11:40:26 1644 0
1 条回答
写回答
取消 提交回答
  • 社区管理员
    递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销很大的算法。
    比如:
    汉诺塔的递归算法:
    void move(char x,char y){
    printf("%c-->%c\n",x,y);
    }

    void hanoi(int n,char one,char two,char three){
    /*将n个盘从one座借助two座,移到three座*/
    if(n==1) move(one,three);
    else{
    hanoi(n-1,one,three,two);
    move(one,three);
    hanoi(n-1,two,one,three);
    }
    }

    main(){
    int n;
    printf("input the number of diskes:");
    scanf("%d",&n);
    printf("The step to moving %3d diskes:\n",n);
    hanoi(n,'A','B','C');
    }
    我说下递归的理解方法
    首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的
    首先按我上面说的把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的问题是要将m个的"汉诺块"由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧。所以,mian函数里面有hanoi(m,'A','C','B');这个调用。
    接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么。
    在hannoi函数里有这么三行
    hanoi(n-1,one,three,two);
    move(one,three);
    hanoi(n-1,two,one,three);
    同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢。
    这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hannoi函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行
    最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢。很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n>=1时将n个块由A经由B搬到C的完整功能了。
    递归这个复杂的思想就是这样简单解决的,呵呵 不知道你看懂没。纯手打,希望能帮你理解递归
    总结起来就是不要管递归的具体实现细节步骤,只要知道他的功能是什么,然后利用他自己的功能通过调用他自己去解决自己的功能(好绕口啊,日)最后加上一个极限情况的条件即可,比如上面说的1个的情况。
    2019-07-17 22:55:23
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载