以 Fibonacci 数列为例,改进传统计算斐波那契数列方法
我们来回顾一下传统递归方式求斐波那契数列方法,我们定义一个count变量来查看递归了多少次:
var count = 0; function fibo( n ){ count++; if( n ==0 || n == 1 ) return 1; return fibo( n - 1 ) + fibo( n - 2 ); } fib1( 20 ); console.log( count1 ); // 5: 15 // 6: 25 // ... // 20: 21891
当 n = 5 式,count = 15,当时当 n = 20 的时候,count就达到惊人的21891次,性能太低了
性能低的原因是 重复计算。如果每次将计算的结果存起来
那么每次需要的时候先看看有没有存储过该数据,如果有,直接拿来用。
如果没有再递归,但是计算的结果需要再次存储起来,以便下次使用
改进版:
var data = [ 1, 1 ]; var count = 0; function fibo( n ) { count++; var v = data[ n ]; if( v === undefined ){ v = fibo( n - 1 ) + fibo( n - 2 ); data[ n ] = v; } return v; } fibo( 100 ); console.log( count ); // 199
改进之后, n = 100的时候也才199次,大大提高了性能。
9.闭包的性能问题函数执行需要内存,那么函数中定义的变量,会在函数执行结束后自动回收,凡是因为闭包结构的,被引出的数据,如果还有变量引用这些数据的话,那么这些数据就不会被回收。
因此在使用闭包的时候如果不适用某学数据了,一定要赋值一个null
var f = (function () { var num = 123; return function () { return num; }; })(); // f 引用着函数,函数引用着变量num // 因此在不适用该数据的时候,最好写上 f = null;
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》