递归简析

递归简析


递归。简单吗?也许吧。但是对我来说,这个东西,太深奥了。

先扯远点,有句话叫“滴水见海,一叶见春”嘛。所以很多巨大的东西(比如说宇宙)可以无限的缩小,缩小到一个点(比如说原子)或者说巨大的东西都是由细小的东西构建起来的。这正是递归的根本思想。

所以,是不是觉得递归很神奇??

言归正传。何为递归?一般的算法书上可以把它 概括为函数对自身的调用就是递归。因为递归这种算法可以把原问题转变为规模较小的问题。它的特点是代码通常简洁√易懂?

递归又分为两类,一种是函数直接调用自身,我们称之为直接递归;还有一种是函数间接调用自身,称为间接递归。[a调用b,b又调用a的递归]

递归其实没什么好说的,打个比方,就是假设你站在一座高楼上,一眼望不到底,而你想知道这座楼到底有多少层,所以你就从上往下一点点找,最后找到了最底层【假设你找的时候忘记了数】、然后找到后再一层一层向上数,最后数到你所在的层数,返回答案。这就是递归的全过程 。

所以,一言以蔽之:往返、双向。

But,递归有一个重要的限制就是终止条件是否恰当。这不仅仅影响着程序结果的准确性,更能让你的程序直接挂掉,甚至让编译器炸掉。

//如果你不信的话,可以调用主函数main()。。。


然后我们可以举一些例子来证实一下:

  • 如何递归的求解X^n?

首先我写了一个下面的东西 :

    #include <stdio.h>
    #include <string.h>
    int x,n,tot;
    int f(int x)
    {
        ++tot;
        if(tot==n)return x;
        return f(x)*x;
    }
    int main()
    {
        scanf("%d%d",&x,&n);
        printf("%d\n",f(x));
        return 0;
    } 

但是好像跟标程相比,感觉怪怪的。。:

    #include <stdio.h>
    int n,x;
    int f(int n)
    {
        if(n==0)return 1;
        else return x*(f(n-1));
    }
    int main()
    {
        scanf("%d%d",&x,&n);
        printf("%d\n",f(x));
        return 0;
    }

虽说函数中调用自己就算是递归,但是总感觉很难掌握这个东西的精髓所在。
貌似递归一定要有一个if(...) return 1/0;

但话也不能说的太绝对。谁说一定要有什么呢?总之吧,递归的应用可是相当大的:

  • GCD/LCM
    不用递归?You are kidding~

GCD(int a,int b){return a%b==0?b:GCD(b,a%b);}

  • 分治算法中的二分查找/答案

  • 递归输出路径

当我们做图论的题的时候,很多时候都会要求你输出一组或多组路径。但这个时候,当我们BFS时,根本不清楚到底哪条路才是我们所要的路径,所以通常我们会用一个pre[]数组,记录这个点的父亲v->u
然后递归着找’爹’,并输出答案

  • 汉诺塔问题

因为人类发明了递归,所以可以解决一些正常人根本解决不出来的问题,比如说《少年班》中,周老师选人时的问题“20阶台阶,每次可以上一级或两级,一共有多少种方法?”抛开电影不谈,这个问题本来就很复杂,可以用到BFS的思想,假设把这个问题看成一张图,那么从根节点开始,每一个点都有两种选择,1或者2,这样似乎可以形成一个满二叉树的图形,但是这仅仅是20的范围,最坏情况会有2^10~2^20种选择。所以,交给计算机吧。

    #include <stdio.h>
    int n;
    int f(int n)
    {
        if(n==1)return 1;
        else if(n==2)return 2;
        else return f(n-1)+f(n-2);
    }
    int main()
    {
        scanf("%d",&n);
        printf("%d\n",f(n));
        return 0;
    }

好像是挺简洁易懂的。

但话说回来,标题不是 汉诺塔 问题吗?!。。

汉诺塔问题是递归中的经典之作,由它所衍生的各种变态加强版的汉诺塔23456等等都十分变态,在这里不过多说明,不久会对此作专门介绍。

  • 升级版暴力

当你在考场上不知所措的时候,不妨想想 这个东西。可能它的效率超乎你的想象,不能Ac至少也比普通的暴力要好一些。所以好好用吧。。


敬请期待 递归专场二 ———— hanoi 系列!!!

11/1/2015 7:42:43 AM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值