递归:
(1)每一级的函数调用都有自己的变量和返回。
(2)递归函数中,位于递归调用前的语句和被调用函数具有相同的执行顺序,
位于递归调用后的语句的执行顺序和被调用函数的顺序相反
#include<stdio.h>
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);
}