递归调用二三事

来源:互联网 发布:两个数字匹配算法 编辑:程序博客网 时间:2024/06/05 09:20

C允许函数调用它自己,这种调用过程称之为递归。

递归方案简单,却没有循环效率高。

举个例子:

#include<stdio.h>
void up_and_down(int);


int main(void)
{
up_and_down(1);
return 0;
}


void up_and_down(int n)
{
printf("Level %d: n location %p\n",n,&n);

if(n<4)
up_and_down(n + 1);
printf("Level %d: n location %p\n",n,&n);

运行结果如下:


注意,每级递归变量n都属于本级递归私有。

说明几点:

1.每级函数调用都有自己的变量。所以程序创建了4个单独的变量,每个变量名都是n,但他们值都不相同。

2.每次函数都会调用一次。当函数执行完毕后,控制权将被传回上一级递归。

3.递归函数中位于递归调用前的语句,均按被调用函数的顺序执行。

4.递归函数中位于递归调用后的语句,均按被调函数相反顺序执行。

5.虽然每级递归都有自己的变量,但是并没有拷贝代码。程序按照顺序执行函数中的代码,而递归调用就相当于又从头开始执行函数代码。除了每次递归调用创建的变量以外,递归调用非常类似于一个循环语句。


尾递归

最简单的递归形式是把递归调用置于函数的末尾,因为他相当于循环。

//使用递归算阶乘

long rfact(int n)

{

    long ans;


    if ( n > 0)

ans = n * rfact ( n - 1 );

    else

ans = 1;

    return ans;

}


递归在处理倒序时非常方便

void to_binary(unsigned long n)

{

    int r;

    r = n%2;

    if( n >= 2)

to_binary(n/2);

     putchar(r == 0?'0':'1');


     return;

}

这就很轻松地解决了将十进制转二进制的问题。

    

0 0