Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาค่าเฉลี่ยอาร์เรย์แบบ Iterative และ Recursive ใน C++

ภาพรวม

โปรแกรมสาธิตการหาค่าเฉลี่ยของอาร์เรย์จำนวนเต็มสองวิธี: Iterative (วนลูป) และ Recursive (เรียกซ้ำ)

สูตรค่าเฉลี่ย

Average = (Sum of all elements) / (Number of elements)

วิธีที่ 1: Iterative Approach (แบบวนลูป)

ใช้ลูป for/while สะสมผลรวม แล้วหารด้วยจำนวนองค์ประกอบ

อัลกอริทึม

  1. กำหนด sum = 0
  2. วนลูป i = 0 ถึง size-1: sum += arr[i]
  3. คืนค่า 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

เปรียบเทียบสองวิธี

ด้านเปรียบเทียบIterativeRecursive
ความเข้าใจง่ายง่าย 直觀ต้องเข้าใจ recursion
หน่วยความจำO(1)O(n) เนื่องจาก call stack
ความเร็วเร็วกว่าเล็กน้อยช้ากว่าเล็กน้อย (function call overhead)
ความเสี่ยง Stack Overflowไม่มีมี ถ้าอาร์เรย์ใหญ่มาก
ความสวยงามของโค้ดปฏิบัติการคณิตศาสตร์/ความสวยงาม

ข้อแนะนำ

  • ใช้ Iterative สำหรับการใช้งานจริง เพราะมีประสิทธิภาพและปลอดภัยกว่า
  • ใช้ Recursive เพื่อการศึกษา เข้าใจหลักการทำงานของ Recursion
  • ใน C++ สามารถใช้ std::accumulate จาก <numeric> สำหรับวิธี Iterative ที่ทันสมัยกว่า