Cho mảng N số nguyên arr[N], nhiệm vụ là tìm trung bình cộng. Có thể dùng cách lặp (iterative) hoặc đệ quy (recursive). Cả hai cách đều được trình bày.
Trung bình = tổng các phần tử / số phần tử.
Phương pháp lặp (Iterative)
Sử dụng vòng lặp for, while, do-while để duyệt và cộng dồn.
Ví dụ
Đầu vào: arr[] = {1, 2, 4, 5, 8}
Đầu ra: 4
Giải thích: Tổng = 20, số phần tử = 5, TB = 20/5 = 4
Thuật toán lặp
double trungBinhLap(int arr[], int size) {
int tong = 0;
for (int i = 0; i < size; i++)
tong += arr[i];
return (double)tong / size;
}
Phương pháp đệ quy (Recursive)
Gọi hàm tự lặp lại cho đến khi duyệt hết mảng. Giá trị trả về lưu trong stack.
Ví dụ
Đầu vào: arr[] = {2, 4, 6, 8}
Đầu ra: 5
Giải thích: Tổng = 20, số phần tử = 4, TB = 5
Thuật toán đệ quy
double deQuy(int arr[], int i, int size) {
if (i == size - 1) return arr[i];
if (i == 0) return (arr[i] + deQuy(arr, i+1, size)) / size;
return arr[i] + deQuy(arr, i+1, size);
}
double trungBinhDeQuy(int arr[], int size) {
return deQuy(arr, 0, size);
}
Ví dụ mã nguồn hoàn chỉnh
#include <iostream>
using namespace std;
// Lặp
double trungBinhLap(int arr[], int size) {
int tong = 0;
for (int i = 0; i < size; i++) tong += arr[i];
return (double)tong / size;
}
// Đệ quy
double deQuy(int arr[], int i, int size) {
if (i == size - 1) return arr[i];
if (i == 0) return (arr[i] + deQuy(arr, i+1, size)) / size;
return arr[i] + deQuy(arr, i+1, size);
}
double trungBinhDeQuy(int arr[], int size) {
return deQuy(arr, 0, size);
}
int main() {
int arr1[] = {2, 3, 1, 6, 8, 10};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
cout << "Trung bình (lặp): " << trungBinhLap(arr1, size1) << endl;
int arr2[] = {1, 5, 3, 2, 6, 7};
int size2 = sizeof(arr2) / sizeof(arr2[0]);
cout << "Trung bình (đệ quy): " << trungBinhDeQuy(arr2, size2) << endl;
return 0;
}
Kết quả chạy chương trình
Trung bình (lặp): 5 Trung bình (đệ quy): 4