百度什么都知道:当然也包括斐波那契(Fibonacci)数列
在一般算法教材中,把Fib数列都是当做递归的经典示例来讲解的:
javascript的写法如下:
//递归法(计算到fib(40)时浏览器就挂掉了) function fib(n){ if (n<=2){ return 1; } return fib(n-1) + fib(n-2); }
在IE9以下的IE浏览器中,跑到fib(40)基本上浏览器就罢工了,比如:
for(var j=1;j<=40;j++){ document.write("fib(" + j + ")=" + fib(j) + "<br />"); }
但是在IE9下,居然能挺过来,看来IE9对javascript引擎的优化确实效果不错
当然,这个数列除了递归,还有其它非递归的解法,一并贴在这里收录一下:
//递归法(计算到fib(40)时浏览器就挂掉了) function fib(n){ if (n<=2){ return 1; } return fib(n-1) + fib(n-2); } for(var j=1;j<=40;j++){ document.write("fib(" + j + ")=" + fib(j) + "<br />"); } document.write("<hr />"); //非递归法1 function fib2(n){ var temp=i=f1=f2=1; if (n<=2){ return 1; } else { for(i=3;i<=n;i++){ temp = f1+f2; f2=f1; f1=temp; } return temp; } } //测试 for(j=1;j<=40;j++){ document.write("fib2(" + j + ")=" + fib2(j) + "<br />"); } document.write("<hr />"); //非递归法2 function fib3(n){ if (n<=2){ return 1; } var x=0,y=1; for (var j=1;j<n;j++) { y = x + y; x = y - x; } return y; } //测试 for(j=1;j<=40;j++){ document.write("fib3(" + j + ")=" + fib3(j) + "<br />"); }