كيفية عمل خوارزمية Recursion

 



سلام دراري، غنكون خديت بزاف نتاع الوقت باش نولي نكتب شي حاجة للي بصح يقدر اي شاب متعلم للبرمجة يستافد منها. مكيهمش شمن تخصص هو كيقرا محيت هد شي للي غادي تعرف معايا دبا صالح لأي حاجة.

البرمجة العودية - Recursion 

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


في عالم البرمجة تقريبا كلشي كيتمحور على كيفية ترتيب البيانات. هد الهدرة كبيرة بزاف. انك تختاصر واحد المجال للي كبير بزاف ب كيفية ترتيب البيانات. ولكن الواقع البرمجي و البحثي كيفرد هد النظرية وكيدعمها بواحد الشكل رهيب. 

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

(python -> a = 5 , java - > int a = 5 , c++ - > int a = 5 , js - > let a = 5 …).

كبداية بسيطة جدا جدا. هكدا وبعد حرق مئات نتاع المراحل تيتم تعريف متغير في داكرة الحاسوبية بواحد المساحة معية (6 byt) و فواحد المكان معين و بواحد الرمز معين (ID). 

محد مزال عندنا غير متغير واحد "(بنسبة للناس للي مفهموش شنو هو متغير بسيط جدا هو واحد القيمة معينة كنسندها ل قيمة أخرى في الغالب تتكون هد العملية بهدف تسهيل استرجاع القيمة الاصلية مثال a = 5 هنا حرف a عطيناه قيمة وللي هي العدد 5, هنا يمكن للي نسا العدد 5 ونبقا عاقل غير على حرف a)".

كيف ما قلنا محد مزال عندنا متغير واحد القدية تتكون ساهلة. بالى بيغنا نقلبو عليه دغيا غادي لقاوه بغينا نجمعوه ولا نطرحوه مع شي قيمة غيكون ساهل إلخ… ولكن يا أخي العزيز تخايل معايا إلا كانو عندنا ملايين المتغييرات كيفاش غادي نديرو نخدمو بيهم ؟ كيفاش غادي نديرو نبحثوا فيهم ؟ كيفاش غادي يمكن للينا نخرجو منهم شي حاجة كيف ما كانت. غادي يكون شبه مستحيل. 

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

مهم اي حاجة تقدر طيح ليك فبالك على كيفاش يمكن لداك البيانات تنضم فراه ديجا كاينة.


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

وخا خلينا نعرفو بعدا هد العودية شنو هي عاد نعرفو كيفاش تيتم الترجمة نتاعها. 

إلا كنتي فايت قاري شي لغة برمجية من قبل اتكون عارف كيفاش ان conditional statement تيخدموا.

وحتا إلا مكنتيش تتعرف فهي بسيطة. عندنا واحد الشرط منطقي بحال 5<8. تنقول للمترجم اللغة مدام ان العدد 8 كبر من 5. فا عاود خدم ليا هد البرنامج. حتا ميبقاش هد الشرط محقق. 

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


print(1) ,print(2) , print(3) , print(4) , print(5) , print(6) , print(7) , print(8) , print(9) , print(10)


بقينا هنا للي بغينا نبرمجوا بهد الطريقة. لدا كنستخدو هد الحويجات نتاع التكرار للي تيعونونا. مثلا الا بغينا ف python نطبعو من 1 الى 10 بستخدام الطريقة التكرارية غتكون على هد الطريقة. 


For i in range(1 , 10):

 print(i)

بكل بساطة هد جوج اسطر كيطبعو ليا من 1 الا 10 بكل سهولة. 

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


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


Function recfun(n) {

 if(n <= 1)

 Return 1;

 

 print(n)

 recfun(n-1) 

}


خلينا نشرحوا هد الكود. في الاول عرفنا اسم وظيفة (function name). من بعد عطيناها ف أول سطر الشرط البدئي للي غادي توقف عليه هد الوظيفة إلا مكانش محقق. (base case).


من بعد طبعنا العدد n للي يقدر يكون أي عدد. من بعد وللينا تصلنا بالوظيفة مرة أخرى ولكن في الاتصال الثاني كان تغير على مستوى الباراميتر, أننا في الاتصال الثاني نقصنا عدد من العدد الاصلي (n-1).

بمعنا حنا إلا كنا عطينا 10 في الاتصال الاول غادي يطبع لي

 10 ولكن في الاتصال الثاني غادي يطبع ليا 9 وهكدا حتا يوصل ليا ل العدد 1 وهو الشرط البدئي للي غادي يتوقع عندو الاتصال. 

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

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

حلينا نجربوا مثال أخر, هو طباعة اعداد Fibonacci. هوما على هد الشاكلة


0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...

مجموع 2 نتاع الاعداد السابقة كيشكلو ليا الرقم الجديد. مع العلم اننا كنعطيوها الاعداد الثلاثة الاولى للي هوما 0 , 1 , 1 و البرنامج كيكمل الاعداد الثالي من عندو وللي هوما كما قلنا مجموع جوج نتاع الاعداد السابقة للي كيشكلوا العدد الجديد. 

 

وخا خلينا نصاوبو برنامج للي يحل لينا هد المشكلة بستعمل البرمجة العودية. 

غيكون على هد الشاكلة : 

 

 

 

static int fib(int n)

    {

    if (n <= 1)

       return n;

    return fib(n-1) + fib(n-2);

    }

 

كيفاش ان هد البرنامج كيخدم إلا عوضنا n ب 5 ؟ هكدا.

 

    


                   fib(5)   

                     /                \

               fib(4)                fib(3)   

             /        \              /       \ 

         fib(3)      fib(2)         fib(2)   fib(1)

        /    \       /    \        /      \

  fib(2)   fib(1)  fib(1) fib(0) fib(1) fib(0)

  /     \

fib(1) fib(0)


علاش هكدا ؟ حيت هدا هو المبدا نتاع العودية. ركز معايا مزيان فهد النقطة لأنها هي كولشي, الوظيفة العودية في الوقت نتاع التشغيل نتاعها تتجمع كل الاتصالات الى حين عدم تتحقق الشرط البدئي. فواحد الهيكل سميتو stack. (هد الهيكلة عندو طريقة خاصة في الادخال و الاخراج نتاع البيانات بحث اخر عدد كيدخل هو اول عدد كيخرج) من بعد تتبقا تستدعي كل إتصال على حدى و تتطرجوا. من بعد تتعطينا النتيجة النهائية بناءا على الشرط البدئي نتاعنا.

إرسال تعليق (0)
أحدث أقدم