JavaScript 中最快的阶乘程序
阶乘程序用于查找给定数字的因子。例如,数字 8 的因数是 1、2、4 和 8。数字 0 和 1 的因数总是 1。同样,每个数字都有一些阶乘数。
在 JavaScript 中编写阶乘程序有两种方法,一种方法是使用递归,另一种方法是使用迭代。我们将使用 for()
循环调用这两个程序 1000 次,每次调用这个程序时,我们都会找到数字 1000 的阶乘。
让我们详细看看这两种方式,稍后我们将看到哪一种是最快的阶乘程序。
在 JavaScript 中使用递归的阶乘程序
递归方法是编写阶乘程序的一种方式。在递归中,我们使用一些基本条件一次又一次地调用相同的函数。基本条件确保我们不会陷入无限循环。
为了检查执行递归程序所需的时间,我们使用 Date
对象的 getItem()
方法。start
变量将存储程序开始执行的时间,而 end
将存储程序完成执行的时间。
众所周知,数字零的阶乘是 1
。所以,我们将把它作为我们的基本条件,一旦一个数字变为零,它就会返回 1
。否则,我们将通过一次又一次地调用相同的阶乘函数来不断找到该数字的阶乘,直到达到 0
。使用递归的阶乘程序的实现如下所示。
let start, end;
start = new Date().getTime();
for (var i = 0; i < 10000; i++) recursionFactorial(1000)
function recursionFactorial(num) {
if (num === 0)
return 1;
else
return num * recursionFactorial(num - 1);
}
end = new Date().getTime();
console.log(end);
输出:
1627808767415
上面显示的输出是递归程序完成执行的时间,它也存储在 end
变量中。时间以毫秒为单位,并打印在浏览器的控制台窗口中。
在 JavaScript 中使用迭代的阶乘程序
编写阶乘程序的另一种方法是使用迭代。在迭代中,我们使用循环,例如 for
、while
或 do-while
循环。
在这里,我们还将使用 Date
对象的 getItem()
方法检查执行迭代程序所需的时间。start2
变量将存储程序开始执行的时间,而 end2
将存储迭代程序完成执行的时间。
在 iterationFactorial()
函数中,我们最初将计数器设置为 1
,然后使用 for 循环通过增加 counter
变量来查找因子。最后,我们返回 counter
变量的值。
let start2, end2;
start2 = new Date().getTime();
for (var i = 0; i < 10000; i++) iterationFactorial(1000);
function iterationFactorial(num) {
var counter = 1;
for (var i = 2; i <= num; i++) counter = counter * i;
return counter;
}
end2 = new Date().getTime();
console.log(end2);
输出:
1627808727136
上面显示的输出是程序结束迭代程序完成执行的时间,它也存储在 end2
变量中。时间以毫秒为单位,并打印在浏览器的控制台窗口中。
JavaScript 中最快的阶乘程序
现在我们已经看到了求一个数的阶乘的递归和迭代程序。现在让我们检查最终结果(即运行这两个程序所花费的时间),看看这两个阶乘程序中哪一个更快。
我们已经在 start
和 end
变量中存储了递归程序的开始和结束时间,在 start2
和 end2
变量中存储了迭代程序的时间。现在我们必须从开始时间中减去结束时间以获得以毫秒为单位的结果时间。
let res1 = end - start;
let res2 = end2 - start2;
console.log('res1: ' + res1 + ' res2: ' + res2)
输出:
res1: 1626 res2: 27
最终结果表明递归程序比迭代程序花费更多的时间。因此,在 JavaScript 中,迭代阶乘程序是最快的。此输出可能因你将在其上执行此程序的系统而异。
Sahil is a full-stack developer who loves to build software. He likes to share his knowledge by writing technical articles and helping clients by working with them as freelance software engineer and technical writer on Upwork.
LinkedIn