شوّيت: شبكة كرة قدم اجتماعية




العودة   سوالف سوفت > سوالف برمجة المواقع وتطويرها > PHP
التسجيل المدوّنات البحث مشاركات اليوم جعل الأقسام مقروءة

الرد على الموضوع
 
LinkBack أدوات الموضوع
عضو نشيط
#1  
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

لي عودة مع المزيد عن الاستدعاء الذاتي ان شاء الله

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

أخوكم محمد






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

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

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


آخر تعديل بواسطة Hawy PHP في 17-11-2007 الساعة 05:22 PM. السبب: خطا إملائي فى عنوان الموضوع
Hawy PHP is offline   قديم 17-11-2007, 03:58 PM
الرد مع إقتباس
عضو نشيط
#2  

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

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

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






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

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

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

Hawy PHP is offline   قديم 17-11-2007, 05:25 PM
الرد مع إقتباس
عضو فعال
#3  

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






__________________
أحمد أبو النصر
Junior php Developer
+20166196074
أحمد أبو النصر is offline   قديم 18-11-2007, 08:42 PM
الرد مع إقتباس
عضو نشيط
#4  

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

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

محمد ،،






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

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

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

Hawy PHP is offline   قديم 20-11-2007, 11:25 PM
الرد مع إقتباس
عضو نشيط جدا
#5  

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

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






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

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

[توقيعك يجب أن لا يكون أطول من 400 حرف يتضمن تجاوز كود المنتدى] - الى متى المعاناة يا حضرة الأدارة ؟
EbNCaNa is offline   قديم 20-11-2007, 11:44 PM
الرد مع إقتباس
عضو سوبر نشيط
#6  

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

بس بكل الاحوال مبدع ... الى الامام حبي .
اكثر استخدامات هذه التقنية تكون في المصفوفات 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
القائد is offline   قديم 22-11-2007, 10:51 PM
الرد مع إقتباس
عضو نشيط جدا
#7  

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






artint.net is offline   قديم 23-11-2007, 12:12 PM
الرد مع إقتباس
عضو نشيط جدا
#8  

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






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

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

[توقيعك يجب أن لا يكون أطول من 400 حرف يتضمن تجاوز كود المنتدى] - الى متى المعاناة يا حضرة الأدارة ؟
EbNCaNa is offline   قديم 23-11-2007, 03:37 PM
الرد مع إقتباس
عضو سوبر نشيط
#9  

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


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

Dr.no






__________________
دكتور لا
Dr.no is offline   قديم 23-11-2007, 10:14 PM
الرد مع إقتباس
عضو نشيط
#10  
Cool

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

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

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

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

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

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

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

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

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

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


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

اخوكم فى الله

محمد ،،






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

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

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

Hawy PHP is offline   قديم 23-11-2007, 11:08 PM
الرد مع إقتباس
عضو نشيط جدا
#11  

موضوع جميل جدا..
ال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
Flasher is offline   قديم 24-11-2007, 02:05 AM
الرد مع إقتباس
عضو سوبر نشيط
#12  

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

Dr.no






__________________
دكتور لا
Dr.no is offline   قديم 24-11-2007, 06:52 PM
الرد مع إقتباس
عضو نشيط
#13  

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






__________________


Mohamed Mahmoud

Mobile : +20103452846

Blog : Hawy PHP

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

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

Hawy PHP is offline   قديم 30-11-2007, 06:31 PM
الرد مع إقتباس
الرد على الموضوع


 

أدوات الموضوع

قوانين المشاركات
لا يمكنك كتابة مواضيع جديدة
لا يمكنك إضافة ردود
لا يمكنك إرسال مرفقات
لا يمكنك تعديل مشاركاتك

كود vB متاح
كود [IMG] متاح
كود HTML غير متاح
Trackbacks are متاح
Pingbacks are متاح
Refbacks are متاح


المواضيع المشابهه
الموضوع كاتب الموضوع القسم الردود آخر مشاركة
اوبرا يتصدر عرش المتصفحات و اكسبلورر ثانياً و فايرفوكس ثالثاً t0010.com الأخبار المتعلقة بالإنترنت والتقنية 32 10-07-2008 09:55 AM
عند النسخ الاحتياطىء يظهر لي خطا..ارجو المساعده raeed الإصلاح والصيانة 7 26-11-2007 04:45 AM
احترف الان التعامل مع محرك البحث الشهير GooGle Top4Adv عروض البيع وطلبات الشراء في البرمجة والتصميم وبناء المحتوى وتبادل الاعلانات 14 31-07-2007 07:00 PM
اضخمـ، موقع عربي وين الداعمينـ، kuwaiteye الويب والويب 2.0 والـ Semantic Web 22 14-12-2005 11:12 PM


جميع الأوقات بتوقيت غرينتش +3. الوقت الآن هو 12:18 PM.