เราจะเขียนฟังก์ชัน JavaScript สองฟังก์ชันที่ทำหน้าที่คำนวณแฟกทอเรียล (Factorial) ของตัวเลขที่รับเข้ามา:
- ฟังก์ชันแรก: ใช้ for loop หรือ while loop ในการคำนวณ
- ฟังก์ชันที่สอง: ใช้วิธีการ Recursive (การเรียกซ้ำ)
จากนั้นเราจะเปรียบเทียบเวลาที่ใช้ในการทำงานของทั้งสองวิธีผ่านการวนซ้ำจำนวนมาก
ตัวอย่างโค้ด
const factorial = (num = 1) => {
let result = 1;
for (let i = 2; i <= num; i += 1) {
result *= i;
}
return result;
}
const factorialRecursive = (num = 1) => {
if (num > 1) {
return num * factorialRecursive(num - 1);
} else {
return 1;
}
};
const ITERATIONS = 100000000;
const num = 12;
console.time('Looping Approach');
for (let i = 0; i < ITERATIONS; i++) {
factorial(num);
}
console.timeEnd('Looping Approach');
console.time('Recursive Approach');
for (let j = 0; j < ITERATIONS; j++) {
factorialRecursive(num);
}
console.timeEnd('Recursive Approach');
ผลลัพธ์ตัวอย่าง
Looping Approach: 886.720ms Recursive Approach: 6526.203ms
ข้อสังเกต
- เวลาที่แท้จริงจะแตกต่างกันไปตามเครื่อง แต่ อัตราส่วนจะคงที่ โดย Loop เร็วกว่า Recursive หลายเท่า
- Recursive ใช้หน่วยความจำมากกว่า (Call Stack) และมี Overhead จากการเรียกฟังก์ชันซ้ำ
- Loop เหมาะสำหรับการคำนวณซ้ำๆ จำนวนมาก
- Recursive เข้าใจง่ายและสะดวกสำหรับปัญหาที่มีโครงสร้างแบบแบ่งย่อย (Divide & Conquer)