تعريف دوال تستدعي نفسها في الخوارزميات
جدول المحتويات
تعريف دوال تستدعي نفسها في الخوارزميات
تعريف دوال تستدعي نفسها في الخوارزميات
مفهوم الـ Recursive Function
Recursion تعني العودة إلى نفس المكان, أي تكرار نفس الشيئ.
Recursive Function تعني دالة return
لنفسها. أي تعيد إستدعاء نفسها بنفسها.
طريقة تعريف Recursive Function
عليك إعتماد الخطوات التالية عند تعريف أي دالة تستدعي نفسها:
- وضع نوع الدالة
int
أو أي نوع لا يقبل الفاصلة مثل النوعlong
. - وضع باراميتر نوعه
int
, لأنه سيكون بمثابة عداد لتكرار عملية استدعاء الدالة. - وضع شرط يحدد كم مرة ستقوم الدالة باستدعاء نفسها, أي كم مرة ستفعل
return
لنفسها. - بما أن الدالة نوعها في الأساس
int
, علينا أن نجعلها ترجع أي قيمة نوعهاint
عندما تنتهي من تكرار نفسها إلى الدالة الأساسيةmain()
أي يجب أن نفعلreturn
لأي قيمة نوعهاint
( مثل 0 ) حتى لا يظهر أخطاء في الكود. - يجب على الأقل أن تحتوي على 2
return
.
معلومة تقنية
إذا جعلت الدالة تستدعي نفسها كثيراً قد يؤدي ذلك إلى مشكلة في ذاكرة الجهاز, لأن الدالة كلما استدعت نفسها ستحتل مساحة معينة في ذاكرة الجهاز, وبالتالي إذا استدعت نفسها كثيراً (ألف مرة على سبيل المثال), قد تجعل ذاكرة جهازك تمتلئ و تجعل نظامك بطيئاً جداً حتى يتوقف كلياً عن العمل.
هناك الكثير من المخترقين الذين سرقوا ملايين الدوالارات من خلال هجماتهم الإلكترونية التي كانت تعتمد على إبطاء عمل سيرفرات البنوك.
الأخطاء المنطقية التي قد تواجه المبرمج عند تعريف Recursive Function
الآن سنكتب دالة بسيطة تستدعي نفسها لإعطاءك فكرة عامة حول شكل الـ Recursive Function و جعلك تعرف طبيعة المشكلة التي قد تحدث في حال لم تجعل الدالة تتوقف عن استدعاء نفسها و بالتالي معرفة أهمية وضع شرط عند كتابة Recursive Function.
إنتبه: إذا قمت بتجربة هذا الكود سيظهر لك خطأ أثناء التشغيل لأن الدالة هنا ستظل تستدعي نفسها دون أن تتوقف.
و كان يجب أن نجعل الدالة ترجع قيمة نوعها int
إلى مكان الإستدعاء عندما تنتهي من التنفيذ لأن نوعها int
و لكننا لم نرجع أي قيمة.
كود الجافا
- package recursion;
- 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()
حيث تم إستدعاءها.
اترك رد
https://jetpack.wordpress.com/jetpack-comment/?blogid=117415624&postid=55863&comment_registration=0&require_name_email=1&stc_enabled=1&stb_enabled=1&show_avatars=1&avatar_default=identicon&greeting=%D8%A7%D8%AA%D8%B1%D9%83+%D8%B1%D8%AF&greeting_reply=%D8%A7%D8%AA%D8%B1%D9%83+%D8%B1%D8%AF%D8%A7%D9%8B+%D8%B9%D9%84%D9%89+%25s&color_scheme=light&lang=ar&jetpack_version=6.2.1&hc_post_as=jetpack&hc_userid=1&hc_username=admin&hc_userurl=&hc_useremail=162bf3e6a7193f11fdeffc5705a64a8c&_wp_unfiltered_html_comment=71b1e0d73d&sig=39ecea966d6944701d0b0ea73299952fc81dee2a#parent=https%3A%2F%2Feduschool40.blog%2F2018%2F07%2F03%2F%25d8%25aa%25d8%25b9%25d8%25b1%25d9%258a%25d9%2581-%25d8%25af%25d9%2588%25d8%25a7%25d9%2584-%25d8%25aa%25d8%25b3%25d8%25aa%25d8%25af%25d8%25b9%25d9%258a-%25d9%2586%25d9%2581%25d8%25b3%25d9%2587%25d8%25a7-%25d9%2581%25d9%258a-%25d8%25a7%25d9%2584%25d8%25ae%25d9%2588%25d8%25a7%25d8%25b1%25d8%25b2%25d9%2585%25d9%258a%25d8%25a7%2F