نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP
أضيف بواسطة Hawyphp في قسم Recursion, ++C, PHPاثناء سفري للمدرسة كنت ادردش مع احد اصدقائي (أمير أمجد) من طلاب كلية الحاسبات والمعلومات بجامعة قناة السويس عن امور برمجية فى لغة السي ++ فسالني عن معرفتي بال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
لي عودة مع المزيد عن الاستدعاء الذاتي ان شاء الله
مراجع
- What Is Recursion
- Recursion In PHP - Examples
- A Gentle Introduction to Symbolic Computation -> Recursion style




17 نوفمبر, 2007 في الساعة 2:58 م
بارك الله فيك معلومات قيمة وفي انتظار جديدك
17 نوفمبر, 2007 في الساعة 3:05 م
ان شاء الله الجديد قادم بقوة وانتظر راي حضرتك فى كل تدوينة
لقاء امس (يوم برمجي فى القاهرة - نفس قهوة السحور ) افتقد حضرتك ، ان شاء الله نشوفك اول جمعة من شهر 12 واول جمعة من كل شهر بعد كده
19 نوفمبر, 2007 في الساعة 12:50 م
موضع شيق ومفيد حقا تسلم يا هاوى ونتظر منك المزيد والمزيد وانشاء الله يا احمد فوزى نشوفك اللقاء القادم ليك وحشه حقا
20 نوفمبر, 2007 في الساعة 10:12 م
الله يسلمك يا احمد وان شاء الله الجديد هيكون مميز ان شاء الله ادعيلنا انت بس
28 نوفمبر, 2007 في الساعة 12:44 م
ربنا يكرمك يامحمد وانت كمان ليك وحشه انت واحمد توفيق وكل الناس اللي قابلتهم بس ظروف شغلي بس صعبه شوية وان شاء الله نتقابل مره تانيه في اقرب فرصة
17 أبريل, 2008 في الساعة 8:45 م
السلام عليكم ورحمة الله وبركاته
موضوع جميل جدا .. وطريقة رائعه في الالقاء والطرح
احب أن اشير ايضا ان هذا يعتبر نوع من التكرارات ..
ويعتبر من ديناميكي .. وهو افضل من ناحيه استهلاك الذاكره
وموارد النظام ..
تحيتي لك يا كاتبنا المبدع
17 أبريل, 2008 في الساعة 9:06 م
@ علي عبد العزيز :
وعليكم السلام
جزاك الله كل خير على زيارتك وان شاء الله ستجد المزيد المفيد قريبا
5 أكتوبر, 2008 في الساعة 7:30 م
السلام عليكم ورحمة الله وبركاته
والله الموضوع مر علي قبل كدة في 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);
}
}
}