Tower of hanoi - Problem solving


 

نقدروا نبسطوا بزاف نتاع الحوايج من خلال الحياة ديالنا اليومية عبر بزاف نتاع المساعدات لتيعونونا باش نبسط .  

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

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

* سلام دراري ليومة غندوي ليكم على البرمجة العودية او Recursion ومدى الفاعلية نتاعها في حل المشاكل المعقدة. للي ميقدرش العقل البشري يعلحها او على الاقل يقدر ولكن أيستغرق مدة طويلة بزاف ويقدروا يكونو اخطاء في عملية الحل. وهنا غادي نستنتجوا علاش بضبط كنحتاجوا شي حوايج في الحياة نتاعنا وهي تتكون في الأصل مجرد حاجة مساعدة باش نوصلوا لشي تصورات عندنا ولا شي حقائق ولا الاجابة على شي أسئلة فلسفية. هنا عندي واحد التعقيب هو ان بالحفظ نتاعك لشي اوامر برمجية ولا نقل شي اوامر فشي نظام وإعادة تطبيق نتاعها وإن نجحات وإن حققتي شي هدف كان عندك فنتا تتكون مجرد مستعمل لا اقل ولا اكثر بحال داك الناس للي تيكونو اول مرة تيجيوا للمغريب وتيعطيوهم بطاقة تصلات المغرب باش يجربوها فهكدا نتا داير تتكون اول مرة ادخل لشي بلاد وفعاوط متيعطيوك داك البطاقة نتاع تصلات تيعطيوك داك الاوامر باش يجربوا مدى الفعالية نتاعها على واحد النطاق واسع. و الأجد تكون المصنع وليس المستهلك…

باش منزيدش نطول عليكم غندخل للموضوع وغادي نقسموا لجوج نتاع الفقرات :

*ماهي البرمجة العودية 

*حل مشكلة بستعمال البرمجة العودية 


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

    function(int arr) // the fun input 

{

//here the size of array unknown                            

Int size = arr.length;

//new the size of array is known                  

//so here will looping the array 

var I = 0 ; // set the i as var 

for(from i to size-1) //the element who has the (size-1) it’s reference to the last number in array 

{

print(arr[i] + “”) // here we print the array 

}

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

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

تخايل معايا اننا بغينا نديروا واحد الوظيفة ل تنزيدو فيها واحد و تنقصوا فيها واحد في نفس الوقت 

N +1 -1 ; 

*ملاظة راه فكل مرة غادي نقصو واحد من العدد n غادي يولي كتالي 

N = n-1; // first 

N-1 = n-1-1 //next

N-1-1 = n-1-1-1 //next .. ect 

الطريقة الاولى و العادية ب loop غيكون الكود كتالي  :

int function (int n) //taking input 

     {

         int result = 0;

         for (int i = 0 ; i<n ; i++)

         {

            result = 1 +  (N - i); // i here from 0 to n 

         }return result;

     }


الطريقة الثانية ب ستحدام العودية  : 


// For understand the recursion Function should be circul your mind! must have dynamic brain 

//let setup the basic code for recursive function it's return itself 

class basic{

   //let consider an N is number

    static int fun(int n)

   {

       //set the basic condition 

       if(n == 1) //if the number n equal 1 return 1 else return 1 + fun(n-1)

       return 1;

       else 

       return 1 + fun(n-1);

   }

   public static void main(String[] args) {

       System.out.println(fun(3));

       /**

        * the first traverse   5 -1+1 = 5

        * the next traverse  4-1+1 = 4

        * the next traverse  3-1+1 = 3 =====> 

        * the next traverse  2-1+1 = 2

        * the next traverse  1 =  return 1 //the basic condition 

        */

   }

}

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

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

انعطيكم واحد المثال اخر تخايل معايا بغينا نديرو واحد Factorial 

شنو هي Factorial بعدا : ترمزوا ليها ب N!

7! It’s  : 1 × 2 × 3 × 4 × 5 × 6 × 7

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


 factorial(int num){


    if(num<=0)

        return 1;


    return num * factorial(num-1);

}


------------------------------------------------------------------


function(int num) {

  let sum = 1;

  for (let i = 1; i <= num; i++) {

    sum *= i;

  }

  return sum;

}

*كا شخص متيعرف والو على البرمجة من الطبيعي انك متفهم والو 

*كشخص كيقرا البرمجة ولكن مزال متيعرفش العودية من طبيعي ان يجيك هدشي شوية معقد

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


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

اسم المشكلة هي tower of hanoi :

 ديجا كنت حطيت هد المشكلة في المجموعة ولكن وليت محيتها لأنها شوية معقدا في الفهم.

شنو المطلوب هنا هو نقلوا داك الاقراص من الموضع 1 الى الموضع 3 بواحد الترتيب هو ان ميمكنش يكون دسيك كبير من تحت ديسك صغير. هنا المشكلة فين كاينى ف ترتيب.(شوف في الصورة اصاحبي فين تتشوف فية انا)

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

مثال بغينا نقلوا 4 نتاع الدياسك من الموضع 1 الى الموضع 3 ايكونو المراحل كتالي : 


Move disk 1 from rod A to rod B

Move disk 2 from rod A to rod C

Move disk 1 from rod B to rod C

Move disk 3 from rod A to rod B

Move disk 1 from rod C to rod A

Move disk 2 from rod C to rod B

Move disk 1 from rod A to rod B

Move disk 4 from rod A to rod C

Move disk 1 from rod B to rod C

Move disk 2 from rod B to rod A

Move disk 1 from rod C to rod A

Move disk 3 from rod B to rod C

Move disk 1 from rod A to rod B

Move disk 2 from rod A to rod C

Move disk 1 from rod B to rod C


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

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

شنو هو الحل غادي نهزو الدياسك كلهم الا الدسك الاخير ف داك الجعبة لتتكون القيمة نتاعو disk-1 :

غادي نقلوهم ل الموضع 2 من ثمة غادي نقلو داك الدسك الاخير (disk-1) ل الموضع 3 ومن تمة غادي نقلوا دياسك للي كاينين في الموضع 2 الى الموضع ثلاثة. وهاهية المشكلة تحلات ونقلنا الدياسك كلهم من الموضع 1 الى الموضع 3 

*توضيح الجعبة رقم 2 هي غير مساعدة  وبس

وباش نفدو هد الفكرة للي قلت راه خاصنا نخدمو ب العودية وغيكون الكود كتالي : 


Procedure Hanoi(disk, source, dest, aux)


   IF disk == 1, THEN //basic condition 

      move disk from source to dest             

   ELSE

//recursion function 

      Hanoi(disk - 1, source, aux, dest)     // Step 1

      move disk from source to dest          // Step 2

      Hanoi(disk - 1, aux, dest, source)     // Step 3

 

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

كنتمنى تكونو ستفدتو شوية  -- دعواتكم ❣️

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