اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

هذا كود يوضح كيفية القيام بذلك :

#include <iostream>
#include <vector>
using namespace std;

// دالة لإيجاد أكبر قيمة في المصفوفة باستخدام الاستدعاء الذاتي
int findMaxRecursively(const vector<int>& arr, int n) {
    // شرط أساسي: إذا كانت المصفوفة تحتوي على عنصر واحد فقط
    if (n == 1)
        return arr[0];

    // قارن العنصر الأخير مع أكبر عنصر في الأجزاء السابقة من المصفوفة
    return max(arr[n-1], findMaxRecursively(arr, n-1));
}

int main() {
    // تعريف المصفوفة
    vector<int> arr = {1, 5, 3, 9, 2, 8, 4};

    // إيجاد أكبر قيمة في المصفوفة باستخدام الاستدعاء الذاتي
    int maxVal = findMaxRecursively(arr, arr.size());

    // طباعة أكبر قيمة
    cout << "The maximum value in the array is: " << maxVal << endl;

    return 0;
}

 

  • 0
نشر

نحن هنا في موقع الأكاديمية لا نقوم بإجابة أسئلة الإختبارات ولكن يمكننا إعطائك الفكرة العامة ويمكنك تطبيقها وإخبارنا بالنتيجة .

أولا يجب عليك إنشاء دالة والتي تقوم بأخذ مصفوفة و عدد العناصر في تلك المصفوفة وترتيب العنصر الحالي .

وبداخل الدالة نقوم أولا بالتحقق من ترتيب العنصر الحالي يساوي عدد العناصر -1 حيث نريد أن نتحقق هل العنصر هو أخر رقم في المصفوفة أم لا وهذا هو شرط إيقاف ال recursion وإذا تحقق الشرط نقوم بإرجاع هذا العنصر .

وبعد ذلك نستدعي الدالة مرة أخري وهذا هو ال recursion ولكن نقوم الآن بتمرير جميع المعاملات السابقة عدي العنصر الحالي نقوم بزيادته ب 1 حتي ننتقل للعنصر الذى يليه ونضعه في متغير.

وأخيرا نقوم بإستدعاء الدالة max ونقارن بين المتغير السابق الذى يتم إرجاعه من ال recursion وبين العنصر الحالي .

وهكذا سيتم المقارنة بال recursion وستبدا من العنصر الأخير والذى يسبقه وهكذا حتي نصل إلى بداية المصفوفة وبعد أخر تنفيذ لدالة ال recursion سيكون لدينا اكبر رقم في المصفوفة.

  • 0
نشر

بالإضافة إلى الطرق السابق، هناك طريق مختلفة لتنفيذ المطلوب.

مثلاً باستخدام خوارزمية "فرّق تسُد" Divide and Conquer، حيث تقوم الخوارزمية بتقسيم المصفوفة إلى نصفين بشكل متكرر، ثم إيجاد أكبر قيمة في كل نصف، ثم مقارنة القيمتين الأكبر من كل نصف لإرجاع القيمة الأكبر في المصفوفة بأكملها.

وهي تعتبر أكثر كفاءة من الطرق المذكورة سالفًا، خاصةً مع المصفوفات الكبيرة، حيث أن تعقيدها الزمني هو O(n log n) بدلاً من O(n) للطرق السابقة.

أولاً داخل دالة بأي اسم نضع لها ثلاث معاملات:

  • arr: المصفوفة التي نبحث فيها عن أكبر قيمة.
  • left: مؤشر بداية الجزء الحالي من المصفوفة.
  • right: مؤشر نهاية الجزء الحالي من المصفوفة.

و تقومين بتقسيم المصفوفة إلى نصفين بشكل متكرر حتى تصل إلى عناصر فردية ثم تقارني أكبر قيمة من النصف الأيسر والأيمن وتُرجع القيمة الأكبر.

ولنضع شرط لو كان المؤشر left يساوي المؤشر right، فيعني أننا وصلنا إلى جزء من المصفوفة يحتوي على عنصر واحد فقط، وهنا نُرجع قيمة ذلك العنصر (arr[left])، لأنه أكبر قيمة في هذا الجزء.

ثم حساب منتصف المصفوفة بجمع left و right ثم القسمة على 2.

بعد ذلك استدعاء الدالة بشكل متكرر للنصف الأيمن، ثم  مقارنة أكبر قيمة من النصف الأيسر والأيمن وإرجاع الأكبر.

في الدالة main، نقوم بإنشاء مصفوفة arr تحتوي على الأرقام، وتستدعي الدالة findMaxRecursively لإيجاد أكبر قيمة في المصفوفة، بالطبع عليك تمرير arr.size() - 1 كمؤشر نهاية المصفوفة لأن arr.size() تُرجع عدد العناصر في المصفوفة، بينما تبدأ عملية فهرسة عناصر المصفوفة من الصفر.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...