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 中,迭代階乘程式是最快的。此輸出可能因你將在其上執行此程式的系統而異。