递归(1)

什么是递归?

一个函数(方法)调用其本身,这种调用过程被称作递归

     1、当一个函数(方法)调用自己时,如果编程中没有设定可以终止递归的条件检测,它会无限制地进行递归调用,所以需要谨慎处理。

     2、递归一般可以代替循环语句使用。有些情况下使用循环语句比较好,而有些时候使用递归更有效。递归方法虽然使程序结构更优美,但其执行效率却没有循环语句高。

1,求1+2+3+...+...n

int sumX(unsigned int x)
{
    if (x == 1)
    {
        return x;
    }
    else
    {
        return sumX(x-1) + x; 
    }
}

 

2,二分查找用递归实现

void binseach(int a[],int high,int low,int key)
{
    if (key > a[high]||key < a[low])
    {
       printf("Not Found %d in a[]\n",key);
       return;
    }
    int mid;
    mid = (high+low)/2;

    if (a[mid] == key)
    {
       printf("a[%d] = %d\n",mid,key);
    }
    else
    {
        if (a[mid] > key)
        {
            binseach(a,mid-1,low,key);
        }
        else
        {
            binseach(a,high,mid+1,key);
        }
    }
}

 注:每一次的递归调用都需要压栈占用内存,效率不高。

 

 递归的原理:

       1、每一级的函数调用都有臫的变量。也就是说:第1级调用中的n不同于第2级调用中的n,因此程序创建了4个独立的变量,虽然每个变量的名字都是但是它们分别具有不同的值。

       2、第一次函数调用都会有一次返回。当程序流执行到某一级递归的结尾处时,它会转移到前1级递归继续执行。程序不能直接返回到main()函数中的初始调用部分,而是通过递归的每一级逐一返回,即从递归的某一级返回到调用它的那一级。

       3、递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。例如在程序中,输出语句site1位于递归调用语句之前,它按照递归调用的顺序被执行了4次,即依次为:第1级,第2级,第3级,第4级。

       4、递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。例如,输出语句site2 位于递归语句后,其执行顺序是:第4级,第3级,第2级,第1级.递归的这种特性在解决涉及反向顺序的编程问题时很有用。

       5、虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。函数代码是一毓的计算机指令,而函数调用就是从头执行这个指令集的一条命令。一个递归调用会使程序从头执行相应函数的指令集,除了为每次调用创建变量,递归调用非常类似于一个循环语句。实际上,递归有时可被用来代替循环,反之亦然。

       6、最后、递归函数中必须包含可以终止递归调用的语句。通常情况下,递归函数会使用一个if条件语句或其它类似的语句以便当函数参数达到某个特定值时结束递归调用。

 

 

 

参考:http://www.cnblogs.com/yangpu/archive/2009/06/06/1497482.html

posted @ 2013-08-20 23:11  dingsd  阅读(259)  评论(0)    收藏  举报