我有 2 个函数来计算 n! (阶乘)。第一个是递归函数,第二个是直接循环。我在 jsperf.com 中测试了它们的性能.对于我测试的所有浏览器,非递归函数都优于递归函数,IE 除外(已针对 v7、8 en 9 进行测试)。现在我非常习惯 IE 和 jscript 是异常(exception),但在这种情况下我很好奇:造成差异的原因可能是什么(换句话说,如果我希望我的阶乘在每个浏览器中都快,我必须真的先检查浏览器;)?
用到的函数有:
//recursive
function factorial(n) {
var result = 1,
fac = function(n) {
return result *= n, n--, (n > 1 ? fac(n) : result);
};
return fac(n);
}
//nonrecursive
function factorialnr(n){
var r = n;
while (--n > 1) {
r *= r != n ? n : 1;
}
return r;
}
最佳答案
可能是因为浏览器无法优化tail recursion .它没有意识到您的 lambda 函数可以迭代重写并消除函数调用的开销。
浏览器并不是真正意义上的完全成熟的编译器,我不希望它们能够执行传统编译器执行的所有优化。如果某个浏览器可以执行特定的优化,那就太好了。但这并不意味着一切都会。
关于javascript - 性能:递归-非递归(IE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5535296/