谈谈递归和循环在Fibonacci中的差别
在网上看资料的时候,谈到使用递归和循环来实现斐布拉数,自己动手写了一个小程序测了一下,感觉他们之间的性能相差还是蛮大。下面将程序贴在这里,然后分析一下原因,希望对大家日后编程有所帮助,有不当的地方,也请大家指出来,共同进步。
下面是javascript实现的
/*递归实现,代码简单,易懂*/
function fib(n)
{
if(n == 1 || n == 0) return 1;
return fib(n-1)+fib(n-2);
}
/*使用循环实现,初看起来有点麻烦*/
function fib2(n)
{
if(n==1 || n==0 ) return 1;
var t1 = 1;
var t2 = 1;
var t3 = 0;
for(var i = 2; i <= n; i++)
{
t3 = t1 + t2;
t1 = t2;
t2 = t3;
}
return t3;
}
正如上面的注释所言,使用递归的方式,看起来一目了然;但是当程序运行起来的时候,且要重复计算很多次,不仅如此,程序还占用大量的临时存储空间。而后面的程序不仅使用的内存空间较少,计算的也比较少。
这个程序计算50以上的值,第一种就会很慢,这里,简单的给一个对比结果,:
这里n=30;
使用递归得到的结果
使用循环的结果