ภาพรวม
โปรแกรมสาธิตการหาค่าเฉลี่ยของอาร์เรย์จำนวนเต็มสองวิธี: Iterative (วนลูป) และ Recursive (เรียกซ้ำ)
สูตรค่าเฉลี่ย
Average = (Sum of all elements) / (Number of elements)
วิธีที่ 1: Iterative Approach (แบบวนลูป)
ใช้ลูป for/while สะสมผลรวม แล้วหารด้วยจำนวนองค์ประกอบ
อัลกอริทึม
- กำหนด sum = 0
- วนลูป i = 0 ถึง size-1: sum += arr[i]
- คืนค่า sum / size
โค้ด C++
double averageIterative(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return static_cast(sum) / size;
}
วิธีที่ 2: Recursive Approach (แบบเรียกซ้ำ)
ใช้ฟังก์ชันเรียกตัวเอง โดยส่งดัชนีปัจจุบันและสะสมผลรวม
แนวคิด
- Base case: ถ้าถึงองค์ประกอบสุดท้าย คืนค่าองค์ประกอบนั้น
- Recursive case: คืนค่า (องค์ประกอบปัจจุบัน + ผลลัพธ์จากการเรียกซ้ำ)
- ที่ระดับบนสุด (i=0) ให้หารด้วย size
โค้ด C++
double recursiveSum(int arr[], int index, int size) {
if (index == size - 1) {
return arr[index]; // Base case
}
return arr[index] + recursiveSum(arr, index + 1, size);
}
double averageRecursive(int arr[], int size) {
if (size == 0) return 0;
return recursiveSum(arr, 0, size) / size;
}
โปรแกรมสมบูรณ์พร้อมทดสอบ
#include <iostream>
using namespace std;
// Iterative
double averageIterative(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return static_cast(sum) / size;
}
// Recursive
double recursiveSum(int arr[], int index, int size) {
if (index == size - 1) return arr[index];
return arr[index] + recursiveSum(arr, index + 1, size);
}
double averageRecursive(int arr[], int size) {
if (size == 0) return 0;
return recursiveSum(arr, 0, size) / size;
}
int main() {
int arr1[] = {2, 3, 1, 6, 8, 10};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int arr2[] = {1, 5, 3, 2, 6, 7};
int size2 = sizeof(arr2) / sizeof(arr2[0]);
cout << "Array 1: ";
for (int x : arr1) cout << x << " ";
cout << "\nIterative: " << averageIterative(arr1, size1);
cout << "\nRecursive: " << averageRecursive(arr1, size1);
cout << "\n\nArray 2: ";
for (int x : arr2) cout << x << " ";
cout << "\nIterative: " << averageIterative(arr2, size2);
cout << "\nRecursive: " << averageRecursive(arr2, size2);
return 0;
}
ผลลัพธ์ตัวอย่าง
Array 1: 2 3 1 6 8 10 Iterative: 5 Recursive: 5 Array 2: 1 5 3 2 6 7 Iterative: 4 Recursive: 4
เปรียบเทียบสองวิธี
| ด้านเปรียบเทียบ | Iterative | Recursive |
|---|---|---|
| ความเข้าใจง่าย | ง่าย 直觀 | ต้องเข้าใจ recursion |
| หน่วยความจำ | O(1) | O(n) เนื่องจาก call stack |
| ความเร็ว | เร็วกว่าเล็กน้อย | ช้ากว่าเล็กน้อย (function call overhead) |
| ความเสี่ยง Stack Overflow | ไม่มี | มี ถ้าอาร์เรย์ใหญ่มาก |
| ความสวยงามของโค้ด | ปฏิบัติการ | คณิตศาสตร์/ความสวยงาม |
ข้อแนะนำ
- ใช้ Iterative สำหรับการใช้งานจริง เพราะมีประสิทธิภาพและปลอดภัยกว่า
- ใช้ Recursive เพื่อการศึกษา เข้าใจหลักการทำงานของ Recursion
- ใน C++ สามารถใช้
std::accumulateจาก<numeric>สำหรับวิธี Iterative ที่ทันสมัยกว่า