02-10-12, 09:37 AM
كاتب الموضوع : جهاد العريقي
هذا الموضوع منقول صاحب الموضوع الاخ رغيد الطيب
السلام عليكم ورحمة الله وبركاته ...
لقد فكرت في عمل سلسة من المواضيع ذات الاهمية للمبرمجين بحيث نناقش فيها بعض المواضيع التي نغفل عنها دائماً او لاتكون هناك معلومات بمتناول الجميع عنها وسوف اسعى فيها لفائدة المبرميجن الذين لهم خبرة لابأس بها في الفيجوال بيسك وكما اني لن انسى التركيز على المبتدئين الذين انا منهم ... كي نتشارك جميعاً في خلق روح للنقاش الجماعي البناء بعيداً عن مناقشة موضوع معين او برنامج بحد ذاته اذ اني لاحظت كون المنتدى اصبح مستودعاً لنسخ حلول المشاكل البرمجية ولم يعد مقراً للناقش حول هذة المشاكل ومحاولة كل فرد منا لطرح مالديه لفائدة الغير ... طبعاً هذا لاينفي روح التعاون التي نلمسها جميعاً بين المشاركات وما يتليها من ردود سريعة لاتدل إلا على وجود هذة الروح فينا ... ولكن ما يؤسفني هنا هو عدم محاولة فهم الحل بالقدر الذي يهتم فيه الجميع بالحصول على الحل ...
لهذا اتمنى من الجميع ان يساعدني في جعل هذه السلسة خالية من المشاركات التي لا تنتمي الى الموضوع الذي نناقشه بحيث نجعل حلقات هذة السلسة مرجع غني لكل فرد فينا في حال نسيانه بعض الطرق او التقنيات او المهارات المهمة ...
-------------------------------------------------------------------------------------------
في هذا الموضوع الجديد من مواضيع [ السلسة الذهبية في المواضيع العلمية ] .. سوف نتطرق بإذن الله تعالى الى موضوع تقنية الإستدعاء الذاتي ويطلق عليه في الانجليزية Recursion وهو موضوع مهم جداً في بناء البرامج واللوغارتيمات التي تكون درجة من التعقيد ...
طبعاً الموضوع يعتبر موضوع خارج نطاق اهتمام المبتدئ في البرمجة لذا فمن الافضل ان تكون ملماً بجميع الاساسيات ولك خبرة لا بأس بها في تصميم دوال خاصة بك حتى تستطيع إستيعاب الفكرة من الاستدعاء الذاتي ... ولكي لا يصاب من لم يفهم ما سوف يأتي معنا بعد قليل بالاحباط وجب التنبيه الى ان الامر يحتاج الى توضيح دقيق وضرب اكبر كمية ممكنة من الامثلة مع شرح لخطوات العمل بالتفصيل الممل ومع ذلك كله فأن نسبة ان تصل الفكرة للجميع هي نسبة صغيرة جداً ولا اظنها تتجاوز 30% كثيراً ... وذلك ان الدور الرئيسي في عدم فهم المعلومة هو سوء نقلها وهذا ما اظنني اعاني منه خاصة مع موضوع معقد بهذا الشكل ... لهذا كله ... همسة في أذن القارئ إن لم تفهم ما سوف يأتي معنا فقم بإلقاء اللوم اولاً على ناقل المعلومة (واضعاً في بالك طبعاً سلامة نيته ومحاولته للإفادة وإن كان الاخفاق نصيبه ) .. وثانياً ضع لومك على قلة الامثلة وعدم وضوحها وبساطتها ثم اخيراً على مدى إللمامك باللغة ( كما أن إهمالك للموضوع في هذة الفترة وعودتك اليه بعد فترة او بحثك عن مصدر آخر للمعلومات سوف يجعل الامر اكثر وضوحاً خاصة وان الامر يستحق ان تبذل مجهوداً فيه وذلك لمن يريد تعزيز فكره البرمجي بهذا السلاح خاصة و أن الاستدعاء الذاتي هو سلاح لايستهان به ابداً - في عالم البرمجة طبعاً ! - ) ....
ملاحظة اخيرة :
معظم الامثلة هي امثلة إرتجالية وليدة اللحظة لهذا فهي تحتمل ورود الخطأ فيها بشكل كبير .. كما ان معظم الامثلة التي سوف اذكرها يمكنك فيها الاستغناء عن الاستدعاء الذاتي وسوف تحقق نفس النتائج اي ان تضمين الاستدعاء الذاتي لن يزيد كفائة الكود في معظم هذة الامثلة وذلك لاني حاولت فقط تضمين اكبر قدر ممكن من الامثلة لتسهيل فهم الموضوع ... ولكن كن ذا ثقة بأنه يوجد حالات كثيرة سوف تختصر فيها عشرات الاسطر البرمجية باستخدامك الاستدعاء الذاتي ...
والان دعنا نبدء بإسم الله الرحمن الرحيم
---------------------------
مفهوم الاستدعاء الذاتي :
---------------------------
هو عبارة عن إستدعاء الاجراء او الدالة لنفسها فمثلاً نحن قد اعتدنا كثيراً ان نرى كود كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
Sub PrintOnForm[/COLOR][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Dim I [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]For [/color][color=#0000bb]I [/color][color=#007700]= [/color][COLOR=#0000bb]1 To N
[/COLOR][color=#007700]Print [/color][COLOR=#0000bb]I
Next
End Sub
[/COLOR][/COLOR]
حيث ان الاجراء PrintOnForm يقوم بطباعة الارقام من 1 الى N على الفورم وهو إجراء بسيط ولكن ماذا اذا كتبنا نفس الاجراء بالصيغة التالية :
كود :
[color=#000000][COLOR=#0000bb]Sub PrintOnForm[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
If [/COLOR][color=#0000bb]N [/color][color=#007700]> [/color][COLOR=#0000bb]0 Then
PrintOnForm N [/COLOR][color=#007700]- [/color][COLOR=#0000bb]1
[/COLOR][color=#007700]Print [/color][COLOR=#0000bb]N
End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][/COLOR]
اذا جربت الكود السابق بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb] PrintOnForm 5
[/COLOR][/COLOR]
سوف تلاحظ ان كلا الاجرائين قد قاما بطباعة الارقام من واحد الى خمسة والاجراء الاول كان مفهوماً اما الثاني ففيه بعض الغموض حيث لا نرى اننا قد قمنا باستخدام اوامر الدوارن فيه ( For او Until او While ) كما ان الاجراء يستدعي نفسه اي انه داخل شفرة الاجراء نجد إستدعاء لنفسه ولكن بتغير المدخلات :
كود :
[color=#000000][COLOR=#0000bb]PrintOnForm N [/color][color=#007700]- [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
لا تشغل بالك عند هذة اللحظة بكيفية عمل هذا الاجراء وكيف قام بطباعة الارقام ! وذلك لاننا سوف نتطرق لذلك لاحقاً ... المهم هنا التركيز على عملية جعل الاجراء او الدالة تستدعي نفسها ...
انظر الى المثال التالي :
كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]Function [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]If [/color][color=#0000bb]N [/color][color=#007700]< [/color][COLOR=#0000bb]2 Then
Sum [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]Sum [/color][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]
تقوم هذة الدالة بإستدعاء نفسها مرة اخرى في السطر
كود :
[color=#000000][COLOR=#0000bb] Sum [/color][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
ما نريد ان نخرج به هنا ان الاستدعاء الذاتي هو ان تقوم الدالة بإستدعاء نفسها داخل الكود الخاص بها ...
--------------------------------------
لماذا نحتاج تقنية الاستدعاء الذاتي :
--------------------------------------
نحتاج الى هذة التقنية بشكل كبير عند الحاجة الى القيام بعدد متكرر من العمليات خذ مثلاً البحث عن جميع الملفات داخل القسم C: مثلاً كيف يتم ؟
يتم اولاً بالبحث عن جميع الملفات داخل الـ C: يلي ذلك البحث عن جميع الملفات داخل اول مجلد في السي لنقل مثلاً C:\Windows ثم بعد ذلك البحث عن الملفات داخل جميع المجلدات التي بداخل C:\Windows ثم العودة الى السي مرة اخرى والبحث في المجلد الثاني لنقل مثلاً C:\Program Files وفي جميع المجلدات الفرعية التي بداخله وهكذا ... والان اذا فكرت قليلاً سوف ترى ان جميع العمليات تتم بصورة مكررة فعندما ينتقل الى مجلد معين نقوم اولاً بمعرفة جمع الملفات التي فيه ثم جميع المجلدات التي فيه بحيث نكرر نفس العملية على جميع المجلدات التي بداخله والان اذا كان لدينا دالة بسيطة وضيفتها البحث عن جميع الملفات في المجلد الحالي ثم تستدعي نفسها بعدد المجلدات الفرعية التي في المجلد وفي كل استدعاء تكرر نفس العلمية ..
قد يبدو الامر مربكاً عند هذة اللحظة ولكن جرب ان تقوم بتصميم دالة تبحث في جميع المجلدات عن الملفات الموجودة سوف تلاحظ انك سوف تقوم ببعض التكرار مع شيء من التعقيد في الكود ... والان انتظر قليلاً حتى نتعرف على اساسيات الاستدعاء الذاتي وسوف ترى كم من السهل ان تقوم بالبحث عن جميع الملفات باستخدام الاستدعاء الذاتي ...
المهم في هذة اللحظة فهم ضرورة اللجوء الى الاستدعاء الذاتي لتسهيل العمليات المعقدة ...
----------------------------------------
اساسيات بناء دوال الاستدعاء الذاتي :
----------------------------------------
ان اهم شيء ينبغي التفكير فيه عند تطوير دالة إستدعاء ذاتي هو معرفة الشرط الذي سوف يتوقف عنده الاستدعاء فمن غير المنطقي ابداً ان يتم الاستدعاء الى ما لا نهاية ولهذا سوف تجد ان معظم دوال الاستدعاء الذاتي تتأكد من شرط النهاية الذي سيتوقف عنده الاستدعاء خذ مثلاً اذا كان لدينا الدالة Sum ووجدنا فيه السطر التالي :
كود :
[color=#000000][COLOR=#0000bb]Sum [/color][color=#007700]= [/color][COLOR=#0000bb]5
[/COLOR][/COLOR]
فهذا معناه نهاية الدالة وإعطائها قيمة ولكن اذا وجدنا هذا السطر داخل الدالة Sum :
كود :
[COLOR=#000000][COLOR=#0000bb]
Sum [/COLOR][color=#007700]= [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]12[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
فأن هذا يدل على ان الدالة Sum سوف تستدعي نفسها مع تمرير القيمة 12 في هذا المثال ...
والان كيف يمكن ان نعرف ان هذا الاستدعاء هو الاستدعاء الاخير ؟
الاجابة على هذا السؤال تكمن في فحص المدخلات الى الدالة اي اننا سوف نفحص المدخلات في كل مرة الى ان نجد الشرط الذي ينبغي عنده التوقف ...
----------------------------------
امثلة و دوال بسيطة مع الشرح :
----------------------------------
دعنا نأخد الدالة Sum التي قمنا بها في المرة الاولى وكودها كان كالتالي :
كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]Function [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]If [/color][color=#0000bb]N [/color][color=#007700]< [/color][COLOR=#0000bb]2 Then
Sum [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]Sum [/color][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]
الان اذا ركزت قليلاً سوف تجد ان اول شرط تقوم به الدالة هو فحص هل المدخل (البارميتر) N يحمل قيمة اصغر من 2 فان الناتج حينها هو :
كود :
[color=#000000][COLOR=#0000bb]Sum [/color][color=#007700]= [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
و الواحد هنا هو قيمة صحيحة لايوجد فيها اي استدعاء ولكن اذا لم يتحقق هذا الشرط فان الناتج هو
كود :
[color=#000000][COLOR=#0000bb] Sum [/color][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
نلاحظ هنا ان الناتج في هذة الحالة سوف يكون المتغير N مضاف اليه ناتج الدالة نفسها ولكن مع تمرير N-1 في هذة المرة فاذا كانت قيمة N=4 فان السطر سوف يكون كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
Sum [/COLOR][color=#007700]= [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
ما سوف تلاحظه انه طالما الـ N اكبر من اثنين فانه سوف يتم استدعاء الدالة بتقليل قيمة الـ N وبالتالي فان في الاخير لابد وان يصل الى اقل من اثنين وينتهي عندها الاستدعاء الذاتي ..
والان دعنا نفهم ماذا سيحصل بالضبط عند استدعاء الدالة Sum طبعاً هذة الدالة وظيفتها ان تجمع القيم من الواحد والى القيمة N فاذا كانت القيمة N=4 فان الناتج هو :
كود :
[COLOR=#000000][COLOR=#0000bb]
N [/COLOR][color=#007700]= [/color][COLOR=#0000bb]4
1 [/COLOR][color=#007700]+ [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]4 [/color][color=#007700]= [/color][COLOR=#0000bb]10
[/COLOR][/COLOR]
اي ان الناتج هو 10 وكذلك الحال اذا كان N=6 فان الناتج ينبغي ان يكون :
كود :
[COLOR=#000000][COLOR=#0000bb]
N [/COLOR][color=#007700]= [/color][COLOR=#0000bb]6
1 [/COLOR][color=#007700]+ [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]6 [/color][color=#007700]= [/color][COLOR=#0000bb]21
[/COLOR][/COLOR]
طبعاً يمكن كتابة الدالة بدون الاستدعاء الذاتي بالشكل التالي:
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
Dim I [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
Dim R [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]For [/color][color=#0000bb]I [/color][color=#007700]= [/color][COLOR=#0000bb]1 To N
R [/COLOR][color=#007700]= [/color][color=#0000bb]R [/color][color=#007700]+ [/color][COLOR=#0000bb]I
Next I
Sum [/COLOR][color=#007700]= [/color][COLOR=#0000bb]R
End [/COLOR][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]
وهي دالة بسيطة وواضحة ولكننا سوف نستغل بساطتها في توضيح مفهوم الاستدعاء الذاتي و تتبع خطواته ...
والان سوف نكتب الدالة بشكل الاستدعاء الذاتي ثم نتبع الخطوات التي سوف تحصل اذا كانت قيمة N=5 :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]If [/color][color=#0000bb]N [/color][color=#007700]< [/color][COLOR=#0000bb]2 Then
Sum [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]Sum [/color][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]
والان عند الاستدعاء الاول للدالة بواسطتة كتابة السطر التالي مثلاً :
كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]Print [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
الان سوف تكون قمية N=5 وعندها فان اول خطوة سوف يفحص قيمة N هل اصغر من 2 وإلا فان الناتج هو :
كود :
[COLOR=#000000][COLOR=#0000bb]
Sum [/COLOR][color=#007700]= [/color][color=#0000bb]N [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]N[/color][color=#007700]-[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]وهذا يعني
Sum [/COLOR][color=#007700]= [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]-[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]
وبالتالي فاننا يمكن ان نستخدم الجدول التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])
[/COLOR][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb]3[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]4[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]5[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
ما نلاحظه من الجدول السابق انه في الاستدعاء الاول كانت قيمة الدالة هي 5 مضاف اليها الدالة نفسها ولكن بتمرير 4 اي ان ناتج Sum(5) هو 5 مضاف الى Sum(4) ولاننا لانعرف كم ناتجSum(4) تقوم باستدعاء نفسها مرة اخرى الى ان نصل الى الخطوة الخامسة وهي الخطوة الحاسمة حيث تتنج قيمة عن الدالة لان المتغير N يساوي واحد اي اصغر من اثنين وبهذا فان ناتج الدالة Sum(1)=1 وعندئذ يتم تعويضه في الخطوة الرابعة فيتنج Sum(2)=2 +1 ومنها فان ناتج Sum(2)=3 وبالتالي يمكن تعويضه في الخطوة الثالثة حيث ان Sum(3)= 3+ 3 .... وهكذا حتى نحصل على قيمة للمعادلة Sum(5)=15 وذلك بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]10 [/color][color=#007700]= [/color][COLOR=#0000bb]15
2[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]6 [/color][color=#007700]= [/color][COLOR=#0000bb]10
3[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]3 [/color][color=#007700]= [/color][COLOR=#0000bb]6
4[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]1 [/color][color=#007700]= [/color][COLOR=#0000bb]3
5[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
حيث ان كل خطوة تنتج بجمع N الى الناتج من الخطوة السابقة وهكذا ...
لنفترض الان ان قيمة N=9 فان الخطوات ستكون كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]9[/color][color=#007700]) = [/color][color=#0000bb]9 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]8[/color][COLOR=#007700])
[/COLOR][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]8[/color][color=#007700]) = [/color][color=#0000bb]8 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]7[/color][COLOR=#007700])
[/COLOR][color=#0000bb]3[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]7[/color][color=#007700]) = [/color][color=#0000bb]7 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]6[/color][COLOR=#007700])
[/COLOR][color=#0000bb]4[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]6[/color][color=#007700]) = [/color][color=#0000bb]6 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][COLOR=#007700])
[/COLOR][color=#0000bb]5[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])
[/COLOR][color=#0000bb]6[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb]7[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]8[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb]9[/color][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
وبالتالي فان الحل سيبدء من الخطوة التاسعة لانها لاتحتوي على استدعاء وفيها قيمة الدالة تساوي واحد وسيتدرج الحل من الخطوة التاسعة حتى الخطوة الاولى بحيث كل خطوة تأخد القيمة من التي سبقتها وهكذا .... بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]9[/color][color=#007700]) = [/color][color=#0000bb]9 [/color][color=#007700]+ [/color][color=#0000bb]36 [/color][color=#007700]= [/color][COLOR=#0000bb]45
2[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]8[/color][color=#007700]) = [/color][color=#0000bb]8 [/color][color=#007700]+ [/color][color=#0000bb]28 [/color][color=#007700]= [/color][COLOR=#0000bb]36
3[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]7[/color][color=#007700]) = [/color][color=#0000bb]7 [/color][color=#007700]+ [/color][color=#0000bb]21 [/color][color=#007700]= [/color][COLOR=#0000bb]28
4[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]6[/color][color=#007700]) = [/color][color=#0000bb]6 [/color][color=#007700]+ [/color][color=#0000bb]15 [/color][color=#007700]= [/color][COLOR=#0000bb]21
5[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]10 [/color][color=#007700]= [/color][COLOR=#0000bb]15
6[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]6 [/color][color=#007700]= [/color][COLOR=#0000bb]10
7[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]3 [/color][color=#007700]= [/color][COLOR=#0000bb]6
8[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]1 [/color][color=#007700]= [/color][COLOR=#0000bb]3
9[/COLOR][color=#007700]) [/color][color=#0000bb]Sum[/color][color=#007700]([/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]1
[/COLOR][/COLOR]
وسنحصل في الاخير على 45 وهو بالطبع ناتج :
كود :
[color=#000000][COLOR=#0000bb]N[/color][color=#007700]=[/color][COLOR=#0000bb]9
1 [/COLOR][color=#007700]+ [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]3 [/color][color=#007700]+ [/color][color=#0000bb]4 [/color][color=#007700]+ [/color][color=#0000bb]5 [/color][color=#007700]+ [/color][color=#0000bb]6 [/color][color=#007700]+ [/color][color=#0000bb]7 [/color][color=#007700]+ [/color][color=#0000bb]8 [/color][color=#007700]+ [/color][color=#0000bb]9 [/color][color=#007700]= [/color][COLOR=#0000bb]45
[/COLOR][/COLOR]
وللدرس بقية انشا الله