递归是神

created by Dejavu
(完结)


有段日子一直在学习opencv,但是有些书中的功能代码经常忘记,因此方便起见会常常上CSDN搜索自己要的代码,经常性的会看到yang_xian521这位博主的文章,而且博客的签名是

迭代的是人,递归的是神

确实对于理解递归的同学来说,递归写功能函数比迭代简单太多,而且一些基本的数据结构,如建树、建图等都用递归使代码简化,使用递归将大大减少了编程难度,但是递归函数在需要进行高速运算的工程下,会显得很糟糕,因为递归的实现机制会造成大量的开销,如果方法运算深度很深的话很容易导致出现栈溢出。个人写代码时,感觉对于深度控制这点python做的比较好,然而在c++和JavaScript中如果代码没优化控制好深度,很容易导致程序奔溃。所以对于计算深度较深的函数最好的方法是用迭代代替递归。

c++递归的实现

//阶乘
int fac(int n) {
  if(n==1) return 1;
  else return n*fac(n--);
}
//斐波那契数列
int fibonacci(int n) {
  if(n==1||n==2) return 1;
  else return fibonacci(n-1)+fibonacci(n-2);
} 

由于函数在内存中是以栈的形式储存和调用的所以在执行时是不断执行自己直到函数不再调用自己,就是return了以后才会执行前面的自己,即递归的运算是倒序的

//例如这里的fac函数
n=5;
start
fac(5) ---> 5*fac(4);
fac(4) -----> 4*fac(3);
fac(3) ------>  3*fac(2);
fac(2) -------->  2*fac(1);
fac(1) ---------->  1
return 1
return 2*fac(1)
return 3*fac(2)
return 4*fac(3)
return 5*fac(4)
end

你可能感兴趣的:(递归是神)