C语言和递归与非递归的优缺点以及选择浅析。



   递归函数与非递归函数区别在于:
  递归代码写出来思路清晰,可读性强。
  而非递归效率高。

  递归和非递归作为解决问题的手段,各有利弊,我们应该熟悉并掌握各自特性,对待不同的问题,做出最优算法。

  例如求斐波那契数列:

int fib(int num)//递归
{
 if(num==1||num==2)
 {
  return fib(num-1)+fib(num-2)
 }
}
int fib(int num)//非递归
{
 int num1=1;
 int num2=1;
 int num=1;
 if(num>2)
 {
  for(int i=3;i<=num;i++)
  {
   num=num1+num2;
   num1=num1;
   num2=num;
  }
 return num;
 }

我们不难看出:
  递归的好处代码相对非递归来说,更为简洁,并且思路清晰。
  递归的坏处由于递归需要系统堆栈,所以消耗空间要比非递归大很多。并且,如果递归深度太深,可能会导致系统奔溃。

   非递归的优点效率高,执行时间只会因为循环的次数增加而增加,没什么额外开销,也不会占用额外空间。
   非递归的缺点并不太容易理解,编写复杂问题时比较困难。

   通俗地说,递归就是将问题层层细化、分解为多个小问题,然后一一解决。而非递归大多数情况下都编程者要去思考整个问题的解决办法,对编程者自身思维有很大挑战。

  在很多情况下,只要有数学公式的支持,递归算法通常很容易解决问题。


  递归和循环之间的选择。一般情况下, 当循环方法比较容易找到时, 你应该避免使用递归。这在问题可以按照一个递推关系式来描述时, 是时常遇到的, 比如阶乘问题就是这种情况。反过来, 当很难建立一个循环方法时, 递归就是很好的方法。实际上, 在某些情形下, 递归方法总是显而易见的, 而循环方法却相当难找到。

  递归算法实际上是一种分而治之的方法,它把复杂问题分解为简单问题来求解。对于某些复杂问题,递归算法是一种自然且合乎逻辑的解决问题的方式,但是递归算法的执行效率通常比较差。因此,在求解某些问题时,常采用递归算法来分析问题,用非递归算法来求解问题;另外,有些程序设计语言不支持递归,这就需要把递归算法转换为非递归算法。

  总之就是,小的简单的用循环,复杂度较高的问题、系统撑得住的情况下用递归。(个人意见)


      递归向非递归的转化
   例如上述代码段,斐波那契数的递归向非递归转化,只需要新增两个局部变量num1,num2,将递归里需要栈区保存的数据交给程序自身来保存,就能完成递归向非递归的转化了。

   这种转化思维大多可以应用在复杂问题的解决上。如果问题过于复杂,直接用非递归一时半会想不出来解决的算法,而且用递归解决要消耗过多的堆栈,或者问题规定了要用非递归来解决,那么可以先将问题用递归的大事化小的思维解出来递归算法,再然后将递归算法转化为非递归算法即可。
  "驾龄"尚短,经验尚浅,不当还望指点。缺陷之处许是学识不足,待学富五车,必补之。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值