关于递归的性能问题

一直以为递归比较方便,也知道递归相对于堆栈实现会有一些性能方面的问题,一直没引起重视,但今天测试了一个实例,结果真的很吓人,看来以后在这方面一定要多多注意了。

问题的提出,题目:已知数列:1,1,2,3,5,8,13,21,34,….. 求第50个数值? 并用c#写出算法?

一看就知道是菲波那契数列,用简单的递归就可以实现。实现代码如下:

  private long fib(int num) {

//递归出口
   if(num==1|| num==2) {
    return 1;
   } 
   else {
    return fib(num-1)+fib(num-2);
   }
  }

结果就测试了一下fib(50)的值为12586269025 ,用的时间是Total Milliseconds:405906.25,哇,人都等老了!

接着想用堆栈实现不用那么多次回溯,应该会快一点,于是就写了一下(实际上,根本不需要用到堆栈,只需要用一些中间变量保存中间结果即可)

  private long fib(int num) { 

  long s,s1,s2;
   s=s1=s2=1;

if(num==1||num==2)

{

return 1;

}

else

{
   for(int i=3;i<=num;i++) {
    s=s1+s2;
    s1 = s2;
    s2 = s;
   }
   return s;

}
  }
结果用了0s。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/gmfirefox/article/details/480433
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞