返回
别再用 for 循环写阶乘了,用闭包一次搞定!
前端
2023-09-02 16:34:15
相信大家在刚学编程时,实现一个阶乘函数一定是小菜一碟。通常的做法是使用 for 循环,像这样:
function factorial(n) {
let result = 1;
for (let i = 1; i <= n; i++) {
result *= i;
}
return result;
}
但是,如果我们换一种思路,使用闭包来实现阶乘,会发现代码更加简洁优雅,而且性能也更好。
闭包实现阶乘
闭包是 JavaScript 中的一种特殊函数,它可以访问其外部作用域中的变量。利用闭包,我们可以将阶乘函数定义为一个高阶函数,像这样:
const factorial = (function() {
let cache = {};
return function(n) {
if (n in cache) {
return cache[n];
} else {
if (n === 0) {
return 1;
} else {
cache[n] = n * factorial(n - 1);
return cache[n];
}
}
};
})();
在这个闭包中,我们使用了一个对象 cache
来存储已经计算过的阶乘值。当我们调用 factorial(n)
时,它首先检查 cache
中是否有 n
的值。如果有,则直接返回。如果没有,则计算 n
的阶乘并将其存储在 cache
中,最后返回结果。
性能对比
让我们比较一下使用 for 循环和闭包实现阶乘的性能。我们使用一个测试用例,计算 100 的阶乘:
console.time("for loop");
console.log(factorial_for(100));
console.timeEnd("for loop");
console.time("closure");
console.log(factorial(100));
console.timeEnd("closure");
运行结果如下:
for loop: 102.492ms
closure: 0.147ms
可以看到,使用闭包实现的阶乘函数性能明显优于使用 for 循环实现的函数。这是因为闭包利用了缓存,减少了重复计算的开销。
总结
使用闭包实现阶乘不仅代码简洁优雅,而且性能也更好。这充分体现了闭包在 JavaScript 中的强大功能。在以后的编程实践中,大家可以多多尝试使用闭包来解决各种问题,相信它会带给你意想不到的收获。