递归函数与非递归函数区别在于:
递归代码写出来思路清晰,可读性强。
而非递归效率高。
递归和非递归作为解决问题的手段,各有利弊,我们应该熟悉并掌握各自特性,对待不同的问题,做出最优算法。
例如求斐波那契数列:
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,将递归里需要栈区保存的数据交给程序自身来保存,就能完成递归向非递归的转化了。
这种转化思维大多可以应用在复杂问题的解决上。如果问题过于复杂,直接用非递归一时半会想不出来解决的算法,而且用递归解决要消耗过多的堆栈,或者问题规定了要用非递归来解决,那么可以先将问题用递归的大事化小的思维解出来递归算法,再然后将递归算法转化为非递归算法即可。
"驾龄"尚短,经验尚浅,不当还望指点。缺陷之处许是学识不足,待学富五车,必补之。