递归与循环

7 篇文章 0 订阅
4 篇文章 0 订阅

 

递归与循环:

 

  1. 同样的操作,在递归中执行的效率要低于循环中执行的效率,因为递归要进行地址的保存,和入栈操作。

 

2.递归与循环是可以相互转换的

 

由于这点有时为了程序的效率需要把递归转换成循环:有如下几种常见的转换情形:

 

  1. 尾部递归:尾部递归是指在一个函数中递归出现在最后,此时递归并不需要维持局部变量所以可以放心转换成循环形式。转换方式为把尾部递归的递归条件变成循环条件然后套在整个函数的外面,最后把对参数的操作放在循环中。如下所示:

 

void f(n) {

           if(n>0)

{

  f(n+1);

      f(n-1); //尾部递归 对参数减一

}

}

 

void f(n) {

           while(n>0)//递归条件改为循环条件

{

  f(n+1);

      n--; //同样对参数的减一

}

}

 

 

 

  1. 第二种需要进行递归消除的是递归树为一条链的时候:

    此时就是说函数中的递归只有一个。这个时候可以把递归转换为迭代循环。如下程序所示。

     

    int  f(n){

    if(n == 0){

          return 0;

    }

    if(n>0){

      return n+f(n-1);

    }

    return sum;

    }

     

     

    int  f(n){

    int sum = 0;

    while(n>0){

       sum = n+1;

       n--;

    }

    return sum;

    }

     

     

    还有其他的递归同样可以转换,有的转换为循环可能难度较大,此时可以转化为栈的形式,用入栈出栈模拟函数调用,同样可以提高效率。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值