اثناء سفري للمدرسة كنت ادردش مع احد اصدقائي عن امور برمجية فى لغة السي ++ فسالني عن معرفتي بال Recursion فكان اول مرة لى اسمع عن هذا المصطلح فطلبت منه ان يشرح ما يعرفه عنه فافادني بانها طريقة تقوم من خلالها باستدعاء الدالة من داخلها العديد من المرات حتي شرط معين لاستخدامها فى شئ متكرر
وسنري الان امثلة على الاستخدام لهذا الاسلوب الرائع وخصوصا بال PHP :
اول مثال كان قاله لي صديقي هو مثال عن المضروبfactorial
والمضروب هو ناتج ضرب عدد معين فى الاعداد التي تسبقه الاكبر من الصفر
اى كمثال مضروب العدد 4 هو 4*3*2*1 = 24
وهذا المثال بلغة السي++ يكون بالشكل الاتي
كود:
#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 ليتم ضربها فى القيم السابقة
اي سيتم الاتي بداخل الدالة
كود:
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 لتضرب فى القيم السابقة وهكذا
اى ستقوم الدالة بعمل الاتي
كود:
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 :court:
لي عودة مع المزيد عن الاستدعاء الذاتي ان شاء الله :app:
مراجع
المصدر : نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP
أخوكم محمد :shy: