النتائج 1 إلى 13 من 13

الموضوع: نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279

    Cool نظرة علي الاستدعاء الذاتي Recursion باستخدام PHP



    اثناء سفري للمدرسة كنت ادردش مع احد اصدقائي عن امور برمجية فى لغة السي ++ فسالني عن معرفتي بال 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 == )  return 1
    elseif( 
    $y >)  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:





    التعديل الأخير تم بواسطة Hawy PHP ; 17-11-2007 الساعة 06:22 PM سبب آخر: خطا إملائي فى عنوان الموضوع
    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل



  2. #2
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    حاولت تعديل عنوان الموضوع من Recusion الى Recursion لكنه يعدل العنوان فى ظهوره فى صفحة الموضوع لكن بالقسم من الخارج لا يقبل التعديل لا اعلم لماذا

    اتمني من الادارة تعديل المصطلح الى Recursion بدلا من Recusion

    جزاكم الله كل خير





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  3. #3


    الموضوع اكتر من رائع
    دروسك دايما مفيدة يا محمد
    جزاك الله كل خير





    __________________
    أحمد أبو النصر
    Junior php Developer
    +20166196074

  4. #4
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    ربنا يكرمك يا احمد وانتظر الجديد ان شاء الله

    وشكرا لادارة سوالف والاستاذ محمود المسعودي فى تعديل عنوان الموضوع جزاهم الله كل خير

    محمد ،،





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  5. #5
    عضو نشيط جدا
    تاريخ التسجيل
    May 2007
    المشاركات
    509


    مشكور اخوي محمد على الموضوع الرائع ... انا قريتو للآخر وبصراحة لما يكون بالمسألة ارقام وحساب وضرب بصيبني وجع بطن ... وصرت افكر بشو ممكن نستعمل هالدالة لامور برمجية بحتة ... يعني مثال عملي بعالم برمجة المواقع شي ملموس بعيد عن الارقام والمعادلات ...

    بس بكل الاحوال مبدع ... الى الامام حبي .





    __________________
    EbNCaNa اخوكم ابن قانا

    [درس] قائمة بريدية بأسهل الطرق بواسطة PHP

    [توقيعك يجب أن لا يكون أطول من 400 حرف يتضمن تجاوز كود المنتدى] - الى متى المعاناة يا حضرة الأدارة ؟

  6. #6
    عضو نشيط جدا
    تاريخ التسجيل
    Dec 2004
    المشاركات
    364


    مشكور اخوي محمد على الموضوع الرائع ... انا قريتو للآخر وبصراحة لما يكون بالمسألة ارقام وحساب وضرب بصيبني وجع بطن ... وصرت افكر بشو ممكن نستعمل هالدالة لامور برمجية بحتة ... يعني مثال عملي بعالم برمجة المواقع شي ملموس بعيد عن الارقام والمعادلات ...

    بس بكل الاحوال مبدع ... الى الامام حبي .
    اكثر استخدامات هذه التقنية تكون في المصفوفات Arrays خصوصا مع المصفوفات التي لها اكثر من بعد واحد.

    اي عند الرغبة في تطبيق دالة معينة على متغير من نوع string أو متغير من نوع array دون معرفة نوع المتغير

    مثال على السريع لتطبيق الدالة intval
    كود PHP:
    function intval_array($var)
    {
        
    $return = array();
        if( ! 
    is_array($var) )
        {
            return 
    intval($var);
        }

        if( 
    count($var) < 1)
        {
            return 
    $var;
        }

        foreach(
    $var as $k=>$v)
        {
            
    $return[$k] = intval_array($v);
        }
        return 
    $return;







    __________________
    الخدمات البرمجية
    تعديلات برمجية - تطوير برمجيات جاهزة - صيانة قواعد بيانات
    برمجة خاصة (الأولوية للأفكار الجديدة والخاصة)

    المراسلة : http://it.rewaq.com

  7. #7
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    181


    البيعرف c++ بتنفع معاك في حجات كثيير في ال php
    درس جمييل






  8. #8
    عضو نشيط جدا
    تاريخ التسجيل
    May 2007
    المشاركات
    509


    اخوي فكرت انو ممكن نستعمل هالفكرة بعمل نظام اقسام لا نهائي ... بمعنى انو يكون بالموقع قسم وبداخل هالقسم في قسم فرعي وبقدر نعمل تفرع لا نهائي لكل قسم ... فكرتي صحيحة ؟؟





    __________________
    EbNCaNa اخوكم ابن قانا

    [درس] قائمة بريدية بأسهل الطرق بواسطة PHP

    [توقيعك يجب أن لا يكون أطول من 400 حرف يتضمن تجاوز كود المنتدى] - الى متى المعاناة يا حضرة الأدارة ؟

  9. #9
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    شكراً على المقال ..
    الـrecursion مفيد في العديد من الاستخدامات .. و لكن يجب التعامل معه بحذر لأنه ممكن استخدام الطرق العادية بكفاءة أكبر من استخدام الـrecursion ... مثل متسلسلة فيبوناتشي الأفضل الابتعاد تماماً عن الـrecursion .. و من ناحية أخرى الـrecursion مفيد جداً في التعامل مع الـtrees ( من أنواع هياكل البيانات ) مثلاً و هو الأفضل و الأسهل من الطرق العادية .. كما يجب الانتباه بشدة إلى الـstopping condition أو الـterminating condition
    و الـrecursion موجود في لغات أخرى مثل الباسكال ..


    ملحوظة : تقريباً الـMain في كود C++ ينقصه int :con2:

    Dr.no





    __________________
    دكتور لا

  10. #10
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279

    Cool



    مشكور اخوي محمد على الموضوع الرائع ... انا قريتو للآخر وبصراحة لما يكون بالمسألة ارقام وحساب وضرب بصيبني وجع بطن ... وصرت افكر بشو ممكن نستعمل هالدالة لامور برمجية بحتة ... يعني مثال عملي بعالم برمجة المواقع شي ملموس بعيد عن الارقام والمعادلات ...

    بس بكل الاحوال مبدع ... الى الامام حبي .
    جزاك الله كل خير
    الاخ القائد جزاه الله كل خير ذكرلك اهم استخدام لهذه التقنية مع المثال

    @ القائد
    جزاك الله كل خير على المشاركة الفعالة والمثال واضح

    @ artint.net
    فعلا لان الPHP مبنية علي السي جزاك الله كل خير

    @Dr.no
    Dr.no شكراً على المقال ..
    الـrecursion مفيد في العديد من الاستخدامات .. و لكن يجب التعامل معه بحذر لأنه ممكن استخدام الطرق العادية بكفاءة أكبر من استخدام الـrecursion ... مثل متسلسلة فيبوناتشي الأفضل الابتعاد تماماً عن الـrecursion .. و من ناحية أخرى الـrecursion مفيد جداً في التعامل مع الـtrees ( من أنواع هياكل البيانات ) مثلاً و هو الأفضل و الأسهل من الطرق العادية .. كما يجب الانتباه بشدة إلى الـstopping condition أو الـterminating condition
    و الـrecursion موجود في لغات أخرى مثل الباسكال ..

    ملحوظة : تقريباً الـMain في كود C++ ينقصه int
    جزاك الله كل خير على الافادة وفعلا الاستدعاء الذاتي بطئ ويمكن بدلا منه حلقات التكرار

    لم اقصد بالدرس هو لاستخدامها فى البرامج وهكذا

    الدرس مجرد تعريف بالتقنية وامثلة على استخدامها فى ال PHP لاني لم اجد احد تكلم عنها

    والتقنية موجودة فى لغات كتير مش باسكال وسي وبس وموجودة فى ال Visual Basic واظن فى البايثون كمان بس مجربتش

    بالنسبة للملحوظة
    معاك حق فعلا غلطة مطبعية وتنفيذية :looking:
    كنت شغال على تربو سي القديم :funny: فمعملش حتي Notice ليها واشتغل عادي


    ربنا يكرمكم اجمعين و مشكورين لتفاعلكم مع الموضوع

    اخوكم فى الله

    محمد ،،





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل


  11. #11
    عضو نشيط جدا
    تاريخ التسجيل
    Feb 2007
    المشاركات
    393


    موضوع جميل جدا..
    الRecursion من الاشياء المهمه جدا وفي بعض المشاكل لايستحسن استمعالها..
    انا ثقافتي جافا لا اتقن الc++ فلذلك ساعطي مثال بالجافا

    قبل ذلك..
    من المعلوم ان عمليه استدعاء دالة واعطاءها (بارمترز "معاملات") فان المكان الذي تم من خلاله الاستدعاء ينتظر النتيجة كذلك يقوم الكومبايلر بمطابقة الارقمنتس بالبارمترز .. وحتى تتم هذه العمليه لابد من استخدام الSTACK الموجوده في الذاكرة كل استدعاء = Push، كل انتهاء واخذ النتيجه = Pop
    مايحصل في الRecursion ان الدالة تستمر في عمليه ال ...Push .. Push.. Push حتى تصل لل Special case ثم تبدا بال Pop .. Pop .. Pop .. فعدد المرات المسموح لك محدود بحجم الستاك في الرام.

    هذا مثال بالجافا:
    كود:
    public class Main {
        
        public Main() {
        }
    
        public static void main(String[] args) {
            Recursive(0);
            
        }
    
    
        static boolean stop = false;
        private static void Recursive(int n) {
            System.out.println(++n);
            try {
                if(!stop)
                   Recursive(n);
            }catch(StackOverflowError e){
                stop = true;
            }
        }
    }

    بينما بطريقة اللوب العاديه (ماانحصكم بتجربتها ممكن يعلق الجهاز علما ان مواصفات جهازي جيده وماتوقف التنفيذ ابد)

    كود:
    public class Main {
        
        public Main() {
        }
    
        public static void main(String[] args) {
            Iterative(0);
        }
    
    
        private static void Iterative(int n) {
            try {
                while(true) 
                    System.out.println(++n);
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    في النهاية هذا مثال جيد للاستفاده من الRecusrion لطباعه النص بالمقلوب دون معرفه طول النص:

    كود:
    public class Main {
        
        public Main() {
        }
        
        public static void main(String[] args) {
            ReversePrintString("abcdefg");
        }
    
        private static void ReversePrintString(String s) {
            char[] chars = s.toCharArray();
            ReversePrintStringRecursive(chars,0);
        }
        
        private static void ReversePrintStringRecursive(char[] s, int pos) {
            try {
                char c = s[pos]; // throws ArrayIndexOutOfBoundsException
                ReversePrintStringRecursive(s,pos+1);
                System.out.print(c);
            }catch(ArrayIndexOutOfBoundsException e) {
                
            }
        }
    }
    تحيتي للجميع.





    __________________
    موقعي الشخصي
    www.Flasher.ws

    جزيرة الفنون
    www.Artsisland.net

  12. #12
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    شكراً Flasher للإفادة .. مع إني مفهمتش حاجة من كود الجافا .. تخصص C++ ..
    و الـRecursion هي فعلاً عبارة عن stack .. و كما تفضلت الـrecursion ممكن يستخدم في الـreverse و مع الـlinked list,,

    Dr.no





    __________________
    دكتور لا

  13. #13
    عضو نشيط
    تاريخ التسجيل
    Sep 2006
    المشاركات
    279


    جزاك الله كل اخير اخي Flasher على الاضافة القوية وشرح مفهوم الrecursion ببساطة





    __________________


    Mohamed Mahmoud

    Mobile : +20103452846

    Blog : Hawy PHP

    Mail : Hawy [.] PHP [@] Gmail.com

    حسبي الله ونعم الوكيل






ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض