مفهوم الـ Recursive Function
Recursion: تعني العودة إلى نفس المكان, أي تكرار نفس الشيئ.
Recursive Function: تعني دالة تفعل return
لنفسها, أي تعيد إستدعاء نفسها بنفسها.
Recursion: تعني العودة إلى نفس المكان, أي تكرار نفس الشيئ.
Recursive Function: تعني دالة تفعل return
لنفسها, أي تعيد إستدعاء نفسها بنفسها.
عليك إعتماد الخطوات التالية عند تعريف أي دالة تستدعي نفسها:
int
أو أي نوع لا يقبل الفاصلة مثل النوع long
.int
, لأنه سيكون بمثابة عداد لتكرار عملية استدعاء الدالة.return
لنفسها.int
, علينا أن نجعلها ترجع أي قيمة نوعها int
عندما تنتهي من تكرار نفسها إلى الدالة الأساسية main()
.return
لأي قيمة نوعها int
( مثل 0 ) حتى لا يظهر أخطاء في الكود.return
.إذا جعلت الدالة تستدعي نفسها كثيراً قد يؤدي ذلك إلى مشكلة في ذاكرة الجهاز, لأن الدالة كلما استدعت نفسها ستحتل مساحة معينة في ذاكرة الجهاز, وبالتالي إذا استدعت نفسها كثيراً (ألف مرة على سبيل المثال), قد تجعل ذاكرة جهازك تمتلئ و تجعل نظامك بطيئاً جداً حتى يتوقف كلياً عن العمل.
هناك الكثير من المخترقين الذين سرقوا ملايين الدولارات من خلال هجماتهم الإلكترونية التي كانت تعتمد على إبطاء عمل سيرفرات البنوك.
الآن سنكتب دالة بسيطة تستدعي نفسها لإعطاءك فكرة عامة حول شكل الـ Recursive Function و جعلك تعرف طبيعة المشكلة التي قد تحدث في حال لم تجعل الدالة تتوقف عن استدعاء نفسها و بالتالي معرفة أهمية وضع شرط عند كتابة Recursive Function.
إنتبه: إذا قمت بتجربة هذا الكود سيظهر لك خطأ أثناء التشغيل لأن الدالة هنا ستظل تستدعي نفسها دون أن تتوقف.
و كان يجب أن نجعل الدالة ترجع قيمة نوعها int
إلى مكان الإستدعاء عندما تنتهي من التنفيذ لأن نوعها int
و لكننا لم نرجع أي قيمة.
public class Recursion { /* ------------------------------- هنا قمنا بتعريف الدالة ------------------------------ */ public static int RecursiveFunction () { return RecursiveFunction(); } /* --------------------------- من هنا يبدأ البرنامج بالتنفيذ --------------------------- */ public static void main (String[] args) { RecursiveFunction(); } }
main()
في البداية, و بالتالي سيتم إستدعاء الدالة RecursiveFunction()
.RecursiveFunction()
ستظل تفعل return
إلى نفسها بدون توقف, أي أنها في كل مرة تتنفذ سترجع إلى نفسها و تتنفذ من جديد.RecursiveFunction()
ترجع إلى نفسها و تنفذ نفسها بدل أن ترجع إلى الدالة main()
إلى اللانهاية كما في الصورة في التالية.RecursiveFunction()
لكي نجعلها تتوقف بعد استدعائها لنفسها عدة مرات.RecursiveFunction()
لم ترجع قيمة إلى الدالة main()
حيث تم إستدعاءها.أكتب دالة تستدعي نفسها إسمهاCountFromTo
تعطيها أي عددين صحيحين فتقوم بطباعة جميع الأعداد الصحيحة الموجودة إبتداءاً من العدد الأول وصولاً إلى العدد الثاني.
فعلياً, سنجعل هذين العددين يحددان كم مرة ستقوم الدالة باستدعاء نفسها.
في البرنامج, قم باستدعاء الدالة CountFromTo()
لتجربتها.
أكتب دالة تستدعي نفسها إسمها CountRecursively()
تعطيها عدد صحيح أكبر من 0 فتقوم بطباعة جميع الأعداد الصحيحة الموجودة من هذا العدد وصولاً إلى 1 بشكل تنازلي.
في البرنامج, قم باستدعاء الدالة CountRecursively()
لتجربتها.
أكتب دالة تستدعي نفسها إسمها Factorial
تعطيها عدد صحيح فترجع الـ Factorial لهذا العدد.
في البرنامج, قم باستدعاء الدالة Factorial()
لتجربتها.
نرجو منك الإنتقال لدورة البرمجة للمبتدئين الجديدة التي أنشأنها كبديل أفضل لهذه الدورة ففي تلك الدورة قمنا بتبسيط الشرح أكثر و جعلناك قادر على تجربة الكود بشكل مباشر في موقعنا.