الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال ضروري في Recursion

بدأه norhan ahmad في 26 يوليو 2011 · 10 رد · 928 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد عمل برنامج يخرج اكبر قيمتين بال array باستخدام ال Recursion واطلب منكم المساعده وهذه هي محاولتي بالحل

#include <iostream>
using namespace std;

int max(int a[],int l,int u)
{
if(l==u)
return a[l];
int m=max(a,l+1,u);
if(m>a[l])
return m;
else
return a[l];

}

void main()
{
int b[]={1,6,5,2,8,9,3,4};
cout<<max(b,0,7)<<endl;
}

هذا البرنامج يخرج اكبر قيمه بال array فقط وانا اريده ان يخرج اكبر قيمتين ارجو المساعده وشكرا

تم تعديل هذه المشاركة بواسطة Xacker في 27 يوليو 2011 في 21:59

#2

اختي لو سمحتي .. استخدمي مستقبلا الرمز <> والذي يقوم بتنسيق الكود .. كما يلي ..

#include <iostream>
using namespace std;

int max(int a[],int l,int u)
{
if(l==u)
return a[l];
int m=max(a,l+1,u);
if(m>a[l])
return m;
else
return a[l];

}

void main()
{
int b[]={1,6,5,2,8,9,3,4};
cout<<max(b,0,7)<<endl;
}

الحل ::

الكود الذي كتبتيه انتي صحيح .. ويؤدي النتيجة المطلوبة بطباعة اكبر رقم .. لكن النقص هو الرقم الثاني .. لذلك وحتى لا تخلط الامور .. قمت بعملية تحايل بسيطة .. لكي يعرض الرقم الثاني ايضا .. جربيها اذا نفعت ..

الطريقة هي .. بعد عملية سحب اومعرفة الرقم الاكبر من المصفوفة ..نقوم بتحويله الى رقم سالب مثلا (-1) .. لكي يصبح هذا الرقم اصغر الارقام ورقم لا يمكن ان يكون موجودا مستقبلا .. لذلك بعدها اذا قمنا بسحب اكبر عدد للمرة الثانية فان العدد الذي يليه سيكون هو العدد الاكبر ..

اضيفي الى الكود الدالة التالية .. وقد صممتها على مبدأ الاستدعاء الذاتي ايضا ..

int find( int arr[],int size, int index)
{
	 if(index < size)
	 {
		if(arr[index]==findMax(arr,size,index))
		{
			arr[index] -=arr[index] +1;
			index++;
			return 1;
		}
	 else
		return find(arr,size,index+1);
		}
}

طريقة الاستدعاء تكون بالشكل التالي ..

void main()
{
int b[]={1,6,5,2,8,9,3,4};
cout<<max(b,0,7)<<endl;
find(b,7,0);
cout<<max(b,0,7)<<endl;
}

هي طريقة تحايل لا اكثر ولا اقل .. ومن الممكن ان تصمم طرق اخرى لحل المشكلة ولكن انا اردت ان استخدم نفس الطريقة التي قمتي بوضعها .. لكي تصبح المعلومة اوضح ..

تحياتي العطرة ..

تم تعديل هذه المشاركة بواسطة سنان محمد صالح في 26 يوليو 2011 في 19:02

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#3

طيق الدالة max على المصفوفة ثم قم بتخزين القيمة المُتحصل عليها في متغير max1 ثم قم باستبعاد max1 من المصفوفة و طبق الدالة max مرة أخرى على الدالة حينها تحصل على ثاني أكبر عدد في المصفوفة.

إذا كنت تفهم الفرنسية فأعتقد أن هذا التعبير أحسن :


Appelez la fonction Max() sur la matrice
Sauvegardez la valeur trouvée dans une variable appelée max1
Appliquez la fonction Max() sur la matrice après avoir enlevé max1
Sauvegardez la nouvelle valeur dans une autre variable max2
Puis max1 et max2 seront les 2 plus grandes valeurs dans la matrice


بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد المتألق في 26 يوليو 2011 في 19:08

#4

شكرا لكل من قام بمساعدتي ولكن اخ احمد المتالق كيف ممكن استبعد max1 من المصفوفه

#5
اقتباس
كيف ممكن استبعد max1 من المصفوفه

Vous pouvez le supprimer de la matrice, comme ça :

#include<iostream>
using namespace std;
int main()
{
    int array[9]={-2,1,0,2,3,7,8,10,15};
    int value,i,j;
    cout << "value = ";
    cin >> value;
    for(i=0; i<9; i++)
    if(array == value) break;
    for(i; i<8; i++)
    array = array[i+1];
    for(i=0; i<8; i++)
    cout << array << " ";
    system("pause");
    return 0;
}
#6

شكرا لك اخ احمد لكن انا اريد الحل بطريقة Recursion كيف ممكن ان استبعد ال max من المصفوفه

#7

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

كانت بالقانون

array[index] -= array[index] +1

9 - ( 9 +1) = -1

بذلك اصبحت هي اقل قيمة .. التالي هو الاكبر .. وتمت دالة البحث Find بشكل الRecursion ...

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#8
اقتباس
كيف ممكن ان استبعد ال max من المصفوفه

طيب, ممكن تشرحي لي طريقة عمل الدالة حتى أقدر أغير الكود ؟

#9

شكرا لك اخ سنان لكن الكود مو شغال وحاولت اعرف المشكله ما عرفت كان في error في اسم الداله وعدلتو بس مو عارفه ليه مو شغال

#10

اختي اسف .. في الرد السابق كنت قد كتبت اسم الدالة كما برمجتها نسيت ان اعدل التغيير ...

لكن هذا هو البرنامج كاملا .. انسخي الكود ونفذيه ..

طبعا دالة استدعاء اكبر قيمة غيرت فيها تغييرات بسيطه ..

#include<iostream.h>

int Max(int array[], int size, int index)
{

  if (index == size - 1) return array[index];

  int r = Max(array, size, index + 1);

	if (array[index] > r)
	 return array[index];
  else
	 return r;
}

int find( int arr[],int size, int index)
{
			if(index < size)
			{
					 if(arr[index]== Max(arr,size,index))
					 {
								arr[index] -=arr[index] +1;
								index++;
								return 1;
					 }
			else
					 return find(arr,size,index+1);
					 }
}



 void main()
  {
	 int b[]={1,6,5,2,8,9,3,4};
	 cout<< Max(b,7,0)<<endl;
	 find(b,7,0);
	 cout<< Max(b,7,0)<<endl;
  }

اسف مره اخرى ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#11

طريقة عمل الكود بعمل فنكشن وبقوم باستدعاءه وبكل مره يزيد واحد على قيمة ال L وبذلك اقوم بمقارنة جميع عتاصر المصفوفه مع العنصر الاول اذا كان ذللك العنصر اكبر من العنصر الاول يقوم بارجاع العنصر اما اذا كان العنصر الاول اكبر فيقوم بارجاع العنصر الاول ويقوم بحفظ النتيجه بال stack حتى يصبح L=u يتوقف استدعاء الفنكشن يذهب الى ال stack ويخرج قيمة ال max من ال stack

شكرا لك اخ سنان الكود شغال شكرا عالمساعده

مواضيع مشابهة