递归与尾递归

递归:
(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);  
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值