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