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

اواجة مشكلة في تتبع الكود

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

السلام عليكم

ارجو توضيح الكود التالي

int print(int x,int i)
{
	if(i<3)
		x=x*print(x,i+1);

	 return x;

}


int main() 
{
	cout<<print(2,1)<<endl;	

return 0;

}

كود يعمل بالاستدعاء الذاتي recursion

مع العلم اني عارف استخدم recursion

ولكن الكود التالي قيمة X تخربطني كثير لا اعرف متى تتغير ومتى لاتتغير

حيث انة كود بسيط ولكن اريد الفكرة منة لاني فاهم ماذا يعمل ولكن عندما اتتبع الكود اواجة مشاكل وهي قمية X

ارجو التوضيح

49940.jpg
#2

ببساطه :blush:

للمعرفه int x, inty:-

متغيريين صحيحه .

بس للفكرة امر IF(){} عشان اذا كان i> 3 يجب طبعا x و ه بس i+1 (الحياة تجربة). بشرط يتحجز ل x الاولويه فى return x; دى . :)

اما فى حالة i يشرط طبعا i=i+1 للافلام سى بلس بلس :lol:

والله أعلم والحمد لله الذى لا يحمد سوى.

wassylla :)

#3
wassylla كتب:

ببساطه :blush:

للمعرفه int x, inty:-

متغيريين صحيحه .

بس للفكرة امر IF(){} عشان اذا كان i> 3 يجب طبعا x و ه بس i+1 (الحياة تجربة). بشرط يتحجز ل x الاولويه فى return x; دى . :)

اما فى حالة i يشرط طبعا i=i+1 للافلام سى بلس بلس :lol:

والله أعلم والحمد لله الذى لا يحمد سوى.

wassylla :)

اخي الغالي شكراً لتعاونك

ولكن لم افهم اي شي من اجابتك

عندما ينتهي الشرط يصل الى 3<3

ماذا يعمل

اواجة صعوبة في تعقب قيمة X

في كل استدعاء هل X تتغير وان تغير هل تتغير في جميع الحالات

لم تتوضح الصورة بشكل جيد مازلت افكر وافكر وافكر ......................

تم تعديل هذه المشاركة بواسطة سار مع الليل في 23 أبريل 2011 في 02:48

49940.jpg
#4

لا تقلق أخي الكود سهل سأشرح لك بمثال:

لدينا الدالة ذات الاستدعاء الذاتي التالية :


int print(int x,int i)
{
if(i<3)
x=x*print(x,i+1);

return x;

}

  • الحالة الاولى
i<3
هنا سيتم استدعاء الدالة مرة اخرى وستتغير قيمة x
  • الحالة الثاية

i>=3

لن يتم الاستدعء الذاتي للدالة و لن تتغير قيمة x

لنضع i=1 و x=4 مثلا


int print(4,1); ==> x=4*[print(4,2)] ==> x=4*[4*[print(4,3)]] ==> x= 4*4*4; // print(4,3)= 4;


تم تعديل هذه المشاركة بواسطة xpero في 23 أبريل 2011 في 03:27

1
#5
xpero كتب:

لا تقلق أخي الكود سهل سأشرح لك بمثال:

لدينا الدالة ذات الاستدعاء الذاتي التالية :


int print(int x,int i)
{
if(i<3)
x=x*print(x,i+1);

return x;

}

لنضع i=1 و x=4 مثلا


int print(4,1); ==> x=4*[print(4,2)] ==> x=4*[4*[print(4,3)]] ==> x= 4*4*4; // print(4,3)= 4;


شكراً اخي الغالي لتجاوبك وتوضيحك

ولكن اليس الاستدعاء الذاتي يبدا نزول وعند انتها الشرط يرجع طلوع

وهذه محاولتي رسمتها لك وطريقة تخيلي ارجو التصحيح اخي الغالي

43968501.jpg

تم تعديل هذه المشاركة بواسطة سار مع الليل في 23 أبريل 2011 في 03:54

49940.jpg
#6

جواب الأخ xpero صحيح ، و رسمتك الاخيرة صحيحة أيضاً ..

عندما نصل لآخر مرحلة ، يتم البدء بتنفيذ ما تبقى من آخر دالة تم استدعاءها وهي الدالة print حيث i =3 و x =2 ، ويتم تنفيذ ماتبقى ( وهو السطر الأخير return x ، لأنه بعد عملية الاستدعاء للدالة print ..) كما يلي :

  • ما تبقى من آخر دالة هو return 2 في مثالك ( قيمة x لم تتغير لأن i=3 ليست أكبر من 3 )
  • ما تبقى من الاستدعاء الثاني هو return 2*2 ( قيمة x أصبحت 4 ، لأن العملية تنفذت حيث i=2 أصغر من 3 ).
  • ماتبقى من الاستدعاء الأول هو return 4*2 (قيمة x أصبحت 8 ، لأن العملية تنفذت حيث i=1 أصغر من 3 ) .

return x;//return 2  this is the last call
return x;// x = 2*2  this is the  second call
return x;// return 4*2 this is the  first call

أي النتيجة النهائية 8 .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

اخي الغالي الشمري شكراً لك الف شكر

كلامك واضح تمام تمام تمام وهذا ما استوعبتة منك ارجو التصحيح

يعني ان الدالة print (2,3)j ترجع بقيمة وهي 2

ثم في الدالة print(2,2)j تتغير قيمة X الى 4

ثم دالة print(2,2)j ترجع بقيمة X وهي 4

ثم دالة print(2,1)j

تضرب القيمة الراجعة من دالة print(2,2)j وهي 4

في قيمة X وهي 2

ثم ترجع دالة print(2,1)j بقيمة X وهي 8

اخي الشميري انا هذه وجهة نظري التي فهمتها من شرحك هل هي صحيحة ارجو التوضيح وبارك الله فيك

49940.jpg
#8

ارجو ان يكون الرسم التخطيطي التالي واضحا اخي:

image1fb.png

1
#9

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

عندما يصبح العدد "ي" اكبر من او يساوي 3 فان الدالة لاتقوم باستدعاء نفسها مرة اخرى بل ستقوم فقط بارجاع قيمة العدد "اكس" فقط اي انها ستصبح بمثابثة دالة تقبل برامتر و ترجع قيمته فقط:


/* if i>=3 */
int print(int x,int i)
{
return x;
}

تم تعديل هذه المشاركة بواسطة xpero في 24 أبريل 2011 في 03:06

1
#10

شكراً لكم جميعاً بفضل الله ثم بفضلكم الان بدات استوعب الاستدعاء الذاتي بشكل جيد

ولكن هل استنتاجي في المشاركة 7 هو صحيح ام يوجد فية خطاء (لا اريد بناء المعلومة على خطاء) ارجو التصحيح

اما باقي التوضيحات نعم فهمتها

49940.jpg
#11
سار مع الليل كتب:

شكراً لكم جميعاً بفضل الله ثم بفضلكم الان بدات استوعب الاستدعاء الذاتي بشكل جيد

ولكن هل استنتاجي في المشاركة 7 هو صحيح ام يوجد فية خطاء (لا اريد بناء المعلومة على خطاء) ارجو التصحيح

اما باقي التوضيحات نعم فهمتها

لقد تم إضافة تعليق تحت مشاركتك رقم 7 ( تحت مشاركتك ) .. :-) ،

قلت أن استنتاجك صحيح إن شاء الله ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

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