نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP

أضيف بواسطة Hawyphp في قسم Recursion, ++C, PHP

اثناء سفري للمدرسة كنت ادردش مع احد اصدقائي (أمير أمجد) من طلاب كلية الحاسبات والمعلومات بجامعة قناة السويس عن امور برمجية فى لغة السي ++ فسالني عن معرفتي بالRecursion فكان اول مرة لى اسمع عن هذا المصطلح فطلبت منه ان يشرح ما يعرفه عنه فافادني بانها طريقة تقوم من خلالها باستدعاء الدالة من داخلها العديد من المرات حتي شرط معين لاستخدامها فى شئ متكرر
وسنري الان امثلة على الاستخدام لهذا الاسلوب الرائع وخصوصا بال PHP :

اول مثال كان قاله لي صديقي أمير وهو مثال عن المضروب factorial
والمضروب هو ناتج ضرب عدد معين فى الاعداد التي تسبقه الاكبر من الصفر
اى كمثال مضروب العدد 4 هو 4*3*2*1 = 24
وهذا المثال بلغة السي++ يكون بالشكل الاتي

C++:
#include<iostream.h>
int factorial(int n){
  if(n<=1) return 1;
    return n*factorial(n-1);
}
main (){
cout<<factorial(4);
return 0;
}

وهذا المثال بال PHP سيكون كالاتي

PHP:
function factorial($n) {
  if($n<=1) return 1;
  return $n*factorial($n-1);
}
print factorial(3); //print (3*2*1) = 6

وشرح استخدام هذا الاسلوب كالاتي
عملنا دالة باسم وليكن factorial تاخذ متغير واحد
بداخل الدالة شرط اذا كان المتغير اصغر من او يساوي 1 تقوم بارجاع القيمة 1
وبعدها نقوم بارجاع العدد المراد معرفة المضروب له * الدالة مرة اخري ولكن نقوم بانقاص قيمة المتغير الداخل لها بقيمة 1
لنفترض ان العدد المراد معرفة المضروب له هو 3 اى 3*2*1 = 6
فى اول استدعاء الدالة لن يتحقق الشرط للرقم المراد معرفة المضروب له وهو 3 (الشرط = ان يكون مساوي للواحد او اصغر منه )
فستقوم بارجاع حاصل ضرب العدد 3 * ( factorial(3-1) = factorial(2) )
فتقوم بارجاع حاصل ضرب العدد 2 * ( factorial(2-1) = factorial(1) )
فى هذه الحالة سيتحقق الشرط وتقوم الدالة بارجاع القيمة 1 ليتم ضربها فى القيم السابقة

اي سيتم الاتي بداخل الدالة

CODE:
factorial(3) => 3* (factorial(2) => 2* (factorial(1) => 1) ) => (3*2*1) = 6

وهكذا فى ادخال اى رقم

ومثال اخر على استخدام الRecursion هو الحصول على ناتج رفع عدد معين لاس معين
توجد دالة جاهزة فى الPHP لعمل هذا وهي دالة pow التي تقوم باخذ متغيرين وترجع قيمة رفع العدد الاول للاس ( العدد الثاني )
ولكن هنا سنستخدم ال Recursion للحصول على نفس اداء هذه الدالة

PHP:
function mypow($x,$y)
{
if( $y == 0 )  return 1;
elseif( $y>0 )  return $x*mypow($x,$y-1);
}
print mypow(2,3); // print 2^3 = 2*2*2 = 16

قمنا بتعريف دالة ولتكن Mypow تاخذ متغيرين وهم الأساس والأس
فى بداية الدالة شرط اذا كان الاس = 0 تقوم بارجاع القيمة 1 لان اى رقم مرفوع للأس 0 يساوي 1
واذا كان الاس اكبر من الصفر اى عددا موجبا يقوم بارجاع قيمة الاساس * الدالة بنفس الاساس ولكن بتقليل الاس بقيمة 1
ولنفترض اننا نريد معرفة ناتج رفع العدد2 للاس 4
فتقوم الدالة بالتحقق من الشرط الاول ولن يتحقق لان الاس 4 وليس 0 فتنتقل للشرط الاخر الذي سيتحقق لان الاس 4 اكبر
من الصفر فتقوم بارجاع قيمة الاساس * الدالة مرة اخري بنفس الاساس ولكن الاس سيكون (الاس -1) وستظل على هذا
حتي يصل الاس الى القيمة 0 فيتحقق الشرط الاول و تعيد حينها القيمة 1 لتضرب فى القيم السابقة وهكذا
اى ستقوم الدالة بعمل الاتي

CODE:
mypow(2,3) => 2* (mypow(2,2) => 2* (mypow(2,1) => 2* (mypow(2,0) =>  1) ) )
أى ان
mypow(2,3) = 2*(2*(2*1))  = 2*2*2 = 8

وهو ناتج رفع ال2 للاس 3 اي ضرب ال2 فى نفسها 3 مرات
اتمني ان اكون قدرت اوصل فكرة الاستدعاء الذاتي باستخدام الPHP

لي عودة مع المزيد عن الاستدعاء الذاتي ان شاء الله

مراجع




8 عدد التعليقات على “نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP”

  1. أحمد فوزي يعلق:

    بارك الله فيك معلومات قيمة وفي انتظار جديدك :)


  2. Hawy PHP يعلق:

    ان شاء الله الجديد قادم بقوة وانتظر راي حضرتك فى كل تدوينة

    لقاء امس (يوم برمجي فى القاهرة - نفس قهوة السحور ) افتقد حضرتك ، ان شاء الله نشوفك اول جمعة من شهر 12 واول جمعة من كل شهر بعد كده


  3. Ahmed Tawfik يعلق:

    موضع شيق ومفيد حقا تسلم يا هاوى ونتظر منك المزيد والمزيد وانشاء الله يا احمد فوزى نشوفك اللقاء القادم ليك وحشه حقا


  4. Hawy PHP يعلق:

    الله يسلمك يا احمد وان شاء الله الجديد هيكون مميز ان شاء الله ادعيلنا انت بس


  5. أحمد فوزي يعلق:

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


  6. علي عبدالعزيز يعلق:

    السلام عليكم ورحمة الله وبركاته

    موضوع جميل جدا .. وطريقة رائعه في الالقاء والطرح

    احب أن اشير ايضا ان هذا يعتبر نوع من التكرارات ..

    ويعتبر من ديناميكي .. وهو افضل من ناحيه استهلاك الذاكره

    وموارد النظام ..

    تحيتي لك يا كاتبنا المبدع


  7. Hawyphp يعلق:

    @ علي عبد العزيز :

    وعليكم السلام

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


  8. محمد من غزة يعلق:

    السلام عليكم ورحمة الله وبركاته
    والله الموضوع مر علي قبل كدة في C# وإضريت إستخدمها في php

    مثال C# للجمع مثال يعني تدخل 5 يجمع (5+4+3+2+1)
    بطريقتين بطريقة loop و Recursion

    class Program
    {
    static void Main(string[] args)
    {
    int x;
    Console.WriteLine("Enter The Number ");
    x=Int32.Parse(Console.ReadLine());
    sumloop(x);
    Console.WriteLine(sumrecursion(x));
    Console.ReadLine();
    }
    public static void sumloop(int x)
    {
    int sum = 0;
    for (int i = 0; x >= i; x--)
    {
    sum = sum + x;
    }
    Console.WriteLine(sum);
    }
    public static int sumrecursion(int x)
    {
    if (x == 1)
    {
    return x;
    }
    else
    {
    return x += sumrecursion(x - 1);

    }
    }
    }


أضف تعليق