递归和尾递归(C实现)

解释这两个名词之前,先说下c语言执行程序所使用的空间,分为4个部分:1、传递参数区域2、返回结果区域3、静态区域4活跃区域

递归包含4个阶段1递推、终止条件下终止递推、回归、回归结束,在递推期间将不断增加活跃区域,在回归期间逐渐释放活跃区域。

递归可以让程序以最小粒子形式处理,简单而强大,但是也有两个缺点:1、活跃区域一直占用空间2、释放空间时间过长。

程序如下

#include<stdio.h>
int main(){
        int n=4,r;
        r=fact(n);
        printf("%d",r);
        return r;
}
int fact(int n){
        if(n == 0){
                return 0;
        }else if(n == 1){
                return 1;
        }else if(n > 1){
                return n*fact(n-1);
        }
}

基于这两个缺点尾递归将会解决这个问题

调用递归方法时,就释放当前活跃区域,然后将自身的返回结果传递到下个方法中,所以就不会一直占用空间,程序如下:

#include<stdio.h>
int main(){
        int n=4,r;
        r=facttail(n,1);
        printf("%d",r);
        return 0;
}
int facttail(int n,int a){
        if(n == 0){
                return 0;
        }else if(n == 1){
                return a;
        }else if(n > 1){
                return facttail(n-1,n*a);
        }
}

刚开始学习c语言,请见笑。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单向递归尾递归可以使用迭代法来消除递归,是因为它们具有的单向调用的特点。在单向递归中,每一层递归都是向同一个方向进行的,因此可以利用循环来模拟递归的过程,从而消除递归。在尾递归中,递归调用出现在函数的最后一步操作中,因此可以使用循环来模拟递归的过程,从而消除递归。 具体的实现方法是,将递归调用所需要的参数保存在一个数据结构中(如栈或队列),然后使用循环来模拟递归的过程。每次循环中,从数据结构中取出一个参数集合,执行相应的操作,然后将生成的新参数集合压入数据结构中,直到数据结构为空为止。 以计算斐波那契数列的例子来说明,对于单向递归实现: ``` int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n-1) + fibonacci(n-2); } } ``` 可以使用循环来消除递归,如下所示: ``` int fibonacci(int n) { int a = 0, b = 1; for (int i = 2; i <= n; i++) { int c = a + b; a = b; b = c; } return b; } ``` 对于尾递归实现: ``` int fibonacci_tail(int n, int a, int b) { if (n == 0) { return a; } else { return fibonacci_tail(n-1, b, a+b); } } int fibonacci(int n) { return fibonacci_tail(n, 0, 1); } ``` 可以使用迭代来消除递归,如下所示: ``` int fibonacci(int n) { int a = 0, b = 1; while (n-- > 0) { int c = a + b; a = b; b = c; } return a; } ``` 可以看到,使用迭代消除递归,可以提高程序的效率和节省栈空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值