إعلان
دورة تطوير التطبيقات باستخدام لغة JavaScript في هذه الدورة ستتعلم لغة جافا سكريبت, استخدام مكتبة React.js, بناء API الموقع بواسطة Node.js, تطوير تطبيق جوال باستخدام React Native, و في نهاية الدورة ستتعلم تطوير تطبيق محادثة شبيه بتطبيق WhatsApp. تعلم الآن
دورة تطوير واجهات المستخدم في هذه الدورة ستتعلم لغة HTML و لغة CSS و لغة JavaScript. من ناحية التطبيق العملي ستتعلم طريقة بناء واجهة متجر إلكتروني مكون من ست صفحات, تحويل خمسة تصاميم PSD إلى صفحات ويب, بناء واجهة مستخدم تشبه موقع يوتيوب, بناء لوحة تحكم إحترافية. تعلم الآن
تطوير تطبيقات باستخدام لغة بايثون في هذه الدورة ستتعلم أساسيات البرمجة بلغة بايثون وصولاً إلى التعامل مع أشهر أطر العمل (Flask و Django) و ستتعلم كيف تبني متجر إلكتروني يمكن للمستخدمين البيع و الشراء من خلاله. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة PHP في هذه الدورة ستتعلم لغة PHP من الصفر, استخدام إطار العمل Laravel بشرح مفصّل و عملي, كيفية تطوير شبكة اجتماعية تشبه Instagram, بناء API لتطبيق جوال وفق أسلوب RESTful, تطوير موقع إعلانات مبوبة, تطوير نظام إدارة محتوى CMS كامل. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة Ruby في هذه الدورة ستتعلم البرمجة بلغة Ruby إنطلاقاً من أبسط المفاهيم وحتى بناء تطبيق حقيقي, إستخدام إطار العمل Ruby on Rails بشرح مفصّل و عملي, بناء تطبيق حقيقي عبارة عن شبكة اجتماعية تشبه تويتر, تطوير مجتمع الكتروني يشبه حسوب I/O. تعلم الآن
دورة علوم الحاسوب هذه الدورة معدة لتكون مدخل لعلوم الحاسوب و لغات البرمجة حيث ستتعرف فيها على أنظمة التشغيل و ستتعمق في نظام لينكس و في كيفية التعامل معه من خلال موجه الأوامر, بالإضافة إلى قواعد البيانات و أساسيات الشبكات و الخوادم و مبادئ الحماية والأمان في الويب. تعلم الآن

    الخوارزميات تعريف دوال تستدعي نفسها

    مفهوم الـ Recursive Function

    Recursion: تعني العودة إلى نفس المكان, أي تكرار نفس الشيئ.

    Recursive Function: تعني دالة تفعل return لنفسها, أي تعيد إستدعاء نفسها بنفسها.

    طريقة تعريف Recursive Function

    عليك إعتماد الخطوات التالية عند تعريف أي دالة تستدعي نفسها:

    1. وضع نوع الدالة int أو أي نوع لا يقبل الفاصلة مثل النوع long.
    2. وضع باراميتر نوعه int, لأنه سيكون بمثابة عداد لتكرار عملية استدعاء الدالة.
    3. وضع شرط يحدد كم مرة ستقوم الدالة باستدعاء نفسها, أي كم مرة ستفعل return لنفسها.
    4. بما أن الدالة نوعها في الأساس int, علينا أن نجعلها ترجع أي قيمة نوعها int عندما تنتهي من تكرار نفسها إلى الدالة الأساسية main().
      أي يجب أن نفعل return لأي قيمة نوعها int ( مثل 0 ) حتى لا يظهر أخطاء في الكود.
    5. يجب على الأقل أن تحتوي على إثنين return.

    معلومة تقنية

    إذا جعلت الدالة تستدعي نفسها كثيراً قد يؤدي ذلك إلى مشكلة في ذاكرة الجهاز, لأن الدالة كلما استدعت نفسها ستحتل مساحة معينة في ذاكرة الجهاز, وبالتالي إذا استدعت نفسها كثيراً (ألف مرة على سبيل المثال), قد تجعل ذاكرة جهازك تمتلئ و تجعل نظامك بطيئاً جداً حتى يتوقف كلياً عن العمل.

    هناك الكثير من المخترقين الذين سرقوا ملايين الدولارات من خلال هجماتهم الإلكترونية التي كانت تعتمد على إبطاء عمل سيرفرات البنوك.

    الأخطاء المنطقية التي قد تواجه المبرمج عند تعريف Recursive Function

    الآن سنكتب دالة بسيطة تستدعي نفسها لإعطاءك فكرة عامة حول شكل الـ 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() لتجربتها.

    الحل و التفسير »

    إعلان

    Eqla3Tech.com

    شروحات مكتوبة حول لغات البرمجة و تقنية المعلومات باللغة العربية مقدمة من إقلاع تك.

    لغة جافا لغة ++C قواعد البيانات نظام ويندوز نظام لينكس الشبكات تقنية المعلومات الأمن السيبراني

    الدورات

    أدوات مساعدة

    الأقسام

    دورات
    مقالات أسئلة مشاريع كتب