递归与尾递归

递归:
(1)每一级的函数调用都有自己的变量和返回。
(2)递归函数中,位于递归调用前的语句和被调用函数具有相同的执行顺序,
位于递归调用后的语句的执行顺序和被调用函数的顺序相反
#include 

void recursive(int n) 

    printf("Begin %d\n", n); 
    if (n<4) 
        recursive(n+1); 
    printf("End %d\n", n);
 }

int main() 

   recursive(1);

   return 0; 

运行结果:
Begin 1
Begin 2
Begin 3
Begin 4
End 4
End 3
End 2
End 1

编译器一般使用栈来实现递归。当调用一个方法的时候,
编译器会把这个方法的所有参数,局部变量及其返回地址(这个方法返回时控制达到的地方)都压入栈中,
然后把控制转移给这个方法。当这个方法返回时,这些值将出栈。控制权重新回到返回地址处。
在递归程序中,每一级递归都会在调用栈上增加一条返回地址。

尾递归即函数调用在末尾,且末尾只能有函数调用,不能有其他操作。
基于函数的尾调用,每一级调用直接用返回函数的返回值更新调用栈,而不是创建新的调用栈。
int calc(int n, int sum)
{
    if (n <= 0)
        return 0;
    else
        return calc(n-1, sum+n);  
}

你可能感兴趣的:(算法,蓝桥杯,p2p,c语言)