[php] نظرة علي الاستدعاء الذاتي (Recusion)
الكاتب: Hawy_PHP | 17 نوفمبر 2007
أثناء سفري للمدرسة كنت ادردش مع أحد اصدقائي عن أمور برمجية في لغة C++ فسالني عن معرفتي بالRecursion فكان اول مرة لى اسمع عن هذا المصطلح فطلبت منه ان يشرح ما يعرفه عنه فافادني بانها طريقة تقوم من خلالها باستدعاء الدالة من داخلها العديد من المرات حتي شرط معين لاستخدامها في شيء متكرر
وسنري الان امثلة على الاستخدام لهذا الاسلوب الرائع وخصوصا بال PHP :
اول مثال كان قاله لي صديقي وهو مثال عن المضروب factorial
والمضروب هو ناتج ضرب عدد معين فى الاعداد التي تسبقه الاكبر من الصفر
اى كمثال مضروب العدد 4 هو 4*3*2*1 = 24
وهذا المثال بلغة السي++ يكون بالشكل الاتي
int factorial(int n){
if(n<=1) return 1;
return n*factorial(n-1);
}
main (){
cout<<factorial(4);
return 0;
}
وهذا المثال بال PHP سيكون كالاتي
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 ليتم ضربها فى القيم السابقة
اي سيتم الاتي بداخل الدالة
وهكذا فى ادخال اى رقم
ومثال اخر على استخدام الRecursion هو الحصول على ناتج رفع عدد معين لاس معين
توجد دالة جاهزة فى الPHP لعمل هذا وهي دالة pow التي تقوم باخذ متغيرين وترجع قيمة رفع العدد الاول للاس ( العدد الثاني )
ولكن هنا سنستخدم ال Recursion للحصول على نفس اداء هذه الدالة
{
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 لتضرب فى القيم السابقة وهكذا
اى ستقوم الدالة بعمل الاتي
أى ان
mypow(2,3) = 2*(2*(2*1)) = 2*2*2 = 8
وهو ناتج رفع ال2 للاس 3 اي ضرب ال2 فى نفسها 3 مرات
اتمني ان اكون قدرت اوصل فكرة الاستدعاء الذاتي باستخدام الPHP
لي عودة مع المزيد عن الاستدعاء الذاتي ان شاء الله