02-10-12, 09:39 AM
تكملة للدرس الاول:
المثال السابق كان لايجاد المجموع للعدد N وسوف اترك ايجاد المضروب لاي عدد N كاتمرين
وبالطبع هو مشابه تماماً لفكرة المجموع باختلاف انه مضروب اي يستخدم الضرب وليس الجمع والدالة بصيغتها العادية هي :
ويبقى على القارئ تحويلها الى صيغة الاستدعاء الذاتي ( وهي ابسط من تعتبر تمرين ذلك لشبهها الكبير إن لم يكن لتماثلها مع الدالة Sum ) ...
-------------
مثال آخر :
-------------
والان دعنا نأخد مثال آخر نفرض ان لدينا نص معين ونريد تصميم دالة تقوم بعكس هذا النص من النقطة التي نريدها ولنسميها Rev بحيث يكون لها مدخلان الاول هو النص والثاني هو الموقع الذي سوف نعكس من عنده خذ مثلاً :
بحيث يكون الناتج من السطر الاول هو "deehgR" .
ومن الثاني هو : "deeh"
ومن الثالث هو : "de"
لاحظ ان العكس في السطر الثاني من الموقع الثالث اي من الحرف h في كلمة Rgheed وبالتالي ينتج deeh وهكذا بالنسبة للثالث ...
والان لكي نعكس النص يجب ان نستخرج حرف بعد حرف ويمكن ذلك عن طريق الدالة Mid مثلاً لكي استخرج الحرف الثالث من كلمة Rgheed اكتب :
وتعني من الكلمة Rgheed استخرج من الموقع الثالث حرف واحد وبالتالي فهو الـ h ...
وهكذا اذا اردنا ان نستخرج الحرف d من الموقع السادس:
والان دعنا نكتب الدالة بصيغتها العادية كالتالي :
ومن تركيب الدالة يتضح انها تبدء من آخر عنصر Len(S) الى الموقع الذي نريد العكس من عنده وهو Pos ثم نستخرج حرف بحرف وبحيث نستخرج الحرف الاخير ثم الذي قبله وهكذا وينتج في الاخير النص معكوس ...
والان دعنا نفكر كيف سنحولها الى صيغة الاستدعاء الذاتي ... اولاً وكما اسلفنا يجب التفكير في الشرط الذي سوف ننتهي عنده وذلك اعتماداً على المتغير المدخل وسوف نستخدم هنا المدخل Pos للفحص (كما استخدمنا المدخل N في المثال السابق ) ...
والفكرة التي سوف نستخدمها هنا هي اننا سوف نقوم بالعكس طالما الموقع Pos اصغر من موقع آخر عنصر بالشكل التالي :
حيث اننا فحصنا هنا انه اذا كان Pos اصغر من موقع آخر عنصر Len(S) بالتالي نستمر بالعكس .... ولكي نفهم الامر دعنا نتتبع المثال لنفرض ان الكلمة هي Rgheed ونريد عكسها من الحرف الاول فاننا سوف نكتب التالي :
من الواضح ان طول النص هو ستة حروف Len(S)=6 .... لاحظ ان الدالة كلها تعتمد على السطر :
اي انه اذا كانت قيمة الـ Pos هي واحد فان السطر السابق سوف يبدو كالتالي :
لاحظ ان الحرف R جاء كناتج من الامر Mid(S,1,1)ويعني استخرج الحرف الاول ...
اما اذا كان الـ Pos=2 فان السطر سوف يبدو :
وهكذا الى ان يكون الـ pos اكبر من الستة عندها يكون الراجع من الدالة هو فراغ اي ان Rev="" وذلك لان الشرط If Pos <= Len(S) Then لن يتحقق وبالتالي سوف نخرج من الدالة مباشرة عند الخطوة السابعة ...
والخطوات كاملة سوف تكون كالتالي
بعد الوصول الى الخطوة الاخيرة ( الخطوة السابعة) فان قيمة الدالة عندها هي فراغ "" ويمكن هنا ان نأخذ هذة القيمة صعوداً ونعوض فيها بالخطوة السادسة ثم الناتج نعوضه في الخامسة وهكذا .. وسوف يكون الحل كالتالي :
وبالتالي فأن الناتج الذي يهمنا هو عند الخطوة الاولى اي النص المعكوس "deehgR" ... ويمكنك ان تجرب نصوص اخرى او تبدء من اي مكان في النص ...
------------
مثال آخر :
------------
لنفرض الان اننا نريد ان نقوم بالبحث في مصفوفة خطية اسمها A(8) مكونة من ثمانية عناصر ومحتوياتها كالتالي :
والان لكي نقوم بعمل بحث عن اي عنصر في المصفوفة ابتداءً من موقع معين بحيث نرجع رقم الموقع الذي فيه العنصر او نرجع صفر في حال عدم وجود العنصر يمكن عندها كتابة دالة مثل هذة :
في الدالة السابقة نقوم بتمرير المصفوفة والعنصر المراد البحث عنه Item وموقع البداية Pos ... خذ مثلاً :
الناتج من السطر الاول هو 6 لان الموقع السادس في المصفوفة يساوي 60 اي ان A(6)=60 ولكن الناتج من السطر الثاني هو صفر فعلى الرغم من المصفوفة تحتوي على الرقم 20 في الموقع الثاني إلا اننا اخبرنا الدالة بان تبدء البحث من الموقع الخامس لهذا فأن الناتج هو 0 .... واما السطر الثالث فان الناتج فيه فهو صفر ايضاً وذلك لان العنصر 45 غير موجود بين عناصر المصفوفة A() .....
والان لكي نكتب المصفوفة بالشكل الذي نستخدم فيه الاستدعاء الذاتي يجب علينا اولاً ان نفكر بالشرط الذي يجب عنده الخروج .... وهو في هذة الحالة ان يتجاوز الموقع الذي نريد البحث فيه موقع آخر عنصر (Max=UBound(A) وفي هذة الحالة يكون الناتج من الدالة صفراً .... والشرط التالي ان يتم العثور على العنصر وفي هذة الحالة يخرج ايضاً ولكن مع ارجاع الموقع الذي عثر على العنصر فيه .. واما الشرط الثالث وهو في حالة ان العنصر غير موجود في الموقع الحالي ويوجد مواقع لم تتم زيارتها بعد فأن الدالة تستدعي نفسها ولكن مع زيادة الموقع Pos الى الموقع الذي يليه Pos+1 وبالتالي فأن الدالة قد تبدو بالشكل التالي :
لنفترض الان اننا نبحث عن الرقم 60 من الموقع 1 فان الخطوات سوف تكون كالتالي :
في المرة الاولى سوف يكون الموقع اصغر من الـ Max وكذلك لن يعتر على العنصر 60 في الموقع الاول لهذا سوف يتنقل الى الموقع التالي وهكذا الى ان يصل الى الموقع السادس وفيه سوف يجد العنصر 60 لهذا سوف يكون الراجع هي قيمة الـ Pos اي 6 في هذة الحالة ثم سوف يتم التعويض بالقيمة 6 في الخطوة الخامسة ثم الرابعة ثم الثالثة وهكذا حتى الاولى وبهذا يكون الناتج هو 6 ... اي ان الحل سوف يكون كالتالي :
وبنفس الطريقة يمكن التجربة عندما يكون العدد غير موجود في المصفوفة فانه سوف يصل الى الحالة الاخيرة التي يكون فيها Pos اكبر من Max وبهذا يتم ارجاع القيمة صفر ويتم التعويض بالقيمة صفر في الخطوات الى الخطوة الاولى ويكون عندها الراجع هو صفر ويعني ان العنصر غير موجود ...
لاحظ ان استخدام الدالة Find السابقة بدون الاستدعاء الذاتي كان اكثر كفائة من الحالة التي استخدمنا فيها الاستدعاء الذاتي لعدة اسباب منها اننا في حالة الاستدعاء الذاتي قمنا بعمليات فحص اكثر ... اي شرطان بدل الشرط الواحد بدون الاستدعاء الذاتي :
1-هل Pos اكبر من Max
2-هل A(Pos)=Item
كما ان العبارة Max=Ubound(A) يتم تنفيذها مرة واحدة (بدون الاستدعاء الذاتي) واما في حالة الاستدعاء الذاتي فانه يتم تنفيذها بعدد المرات التي يتم استدعاء الدالة فيها ... (طبعاً يمكن تلافي ذلك بتمرير القيمة العظمى للمصفوفة بدلاً من حسابها يدوياً ) ....
على الرغم العيوب السابقة فانه يمكن تحسين البحث ولكني هنا اعتمد التبسيط لهذا فأن تركيزنا هو كيف يعمل الاستدعاء الذاتي وكيف تتمكن من تتبع الدوال التي كتبت بصيغة الاستدعاء الذاتي ....
--------------------
حالات اكثر تعقيداً :
--------------------
لاحظنا في الامثلة السابقة ان جميع الحالات تم فيها استدعاء الدالة مرة واحدة فقط اي انه في كل استدعاء للدالة فانها تستدعي نفسها مرة واحدة ولكن يوجد حالات تقوم الدالة فيها باستدعاء نفسها اكثر من مرة وهنا تكمن قوة الاستدعاء الذاتي وسوف اضرب اكثر الامثلة شهرة في هذا المجال وهي حساب سلسلة Fibonacci و هذة السلسلة لها معادلة
خاصة حيث ان كل عنصر فيها هو عبارة عن مجموع العنصرين اللذان يسبقانه في هذة السلسلة وهي كالتالي :
فاذا نظرت الى العنصر رقم 6 مثلاً فانه عبارة عن جمع العنصر رقم 5 (الذي يساوي 8) والعنصر رقم 4 (الذي يساوي 5) وبالتالي فان العنصر رقم 6 يساوي 13 ....
وينطبق هذا الوضع على جميع العناصر ماعدا العنصرين رقم صفر ورقم واحد فكلاهما يحملان القيمة 1 ...
يتضح مما سبق انه اذا كانت اسم الدالة مثلاً Fib فان Fib(N) تساوي 1 اذا كان N =0 او N=1 وغير ذلك فان Fib(N)= Fib(N-1)+Fib(N-2) .... بالشكل التالي :
لهذا فأن كتابة دالة الاستدعاء الذاتي سيكون بسيطاً جداً بينما اذا فكرت في بنائه بدون استدعاء ذاتي فان هذا سيكون مرهقاً ....
والدالة هي كالتالي :
---------
خاتمة :
---------
مما سبق يمكن رؤية ان استخدام الاستدعاء الذاتي بالشكل الصحيح سوف يمكنك من تبسيط المسائل البرمجية المعقدة خاصة وان معظم الخوارزميات او اللوغارتيمات القوية تستخدم تقنية الاستدعاء الذاتي بشكل اساسي فيها مثل لوغارتيمات الفرز السريع ومن اشهرها QuickSort الذي يستخدم تقنية الاستدعاء الذاتي لتنفيذ مبدأ فرق تسد (Divide And Conquer) وهو من المبادئ المهمة في تصميم اللوغارتيمات كما ان معظم لوغارتيمات ضغط الملفات و البحث في القرص الصلب تستفيد كثيراً من هذة التقنية في عملها ...
اتمنى للجميع حظاً موفقاً و السلام عليكم ورحمة الله وبركاته ...
المثال السابق كان لايجاد المجموع للعدد N وسوف اترك ايجاد المضروب لاي عدد N كاتمرين
وبالطبع هو مشابه تماماً لفكرة المجموع باختلاف انه مضروب اي يستخدم الضرب وليس الجمع والدالة بصيغتها العادية هي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Fact[/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
R [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
[/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
Fact [/COLOR][color=#007700]= [/color][COLOR=#0000bb]R
End [/COLOR][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]ويبقى على القارئ تحويلها الى صيغة الاستدعاء الذاتي ( وهي ابسط من تعتبر تمرين ذلك لشبهها الكبير إن لم يكن لتماثلها مع الدالة Sum ) ...
-------------
مثال آخر :
-------------
والان دعنا نأخد مثال آخر نفرض ان لدينا نص معين ونريد تصميم دالة تقوم بعكس هذا النص من النقطة التي نريدها ولنسميها Rev بحيث يكون لها مدخلان الاول هو النص والثاني هو الموقع الذي سوف نعكس من عنده خذ مثلاً :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Print [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
Print [/COLOR][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700], [/color][color=#0000bb]3[/color][COLOR=#007700])
Print [/COLOR][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700], [/color][color=#0000bb]5[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]بحيث يكون الناتج من السطر الاول هو "deehgR" .
ومن الثاني هو : "deeh"
ومن الثالث هو : "de"
لاحظ ان العكس في السطر الثاني من الموقع الثالث اي من الحرف h في كلمة Rgheed وبالتالي ينتج deeh وهكذا بالنسبة للثالث ...
والان لكي نعكس النص يجب ان نستخرج حرف بعد حرف ويمكن ذلك عن طريق الدالة Mid مثلاً لكي استخرج الحرف الثالث من كلمة Rgheed اكتب :
كود :
[COLOR=#000000][COLOR=#0000bb]
Mid[/COLOR][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]3[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]وتعني من الكلمة Rgheed استخرج من الموقع الثالث حرف واحد وبالتالي فهو الـ h ...
وهكذا اذا اردنا ان نستخرج الحرف d من الموقع السادس:
كود :
[color=#000000][COLOR=#0000bb]Mid[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]6[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]والان دعنا نكتب الدالة بصيغتها العادية كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]String
Dim T [/COLOR][color=#007700]As [/color][COLOR=#0000bb]String
Dim I [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]For [/color][color=#0000bb]I [/color][color=#007700]= [/color][color=#0000bb]Len[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700]) [/color][color=#0000bb]To Pos Step [/color][color=#007700]-[/color][COLOR=#0000bb]1
T [/COLOR][color=#007700]= [/color][color=#0000bb]T [/color][color=#007700]+ [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]I[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]Next
Rev [/COLOR][color=#007700]= [/color][COLOR=#0000bb]T
End [/COLOR][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]ومن تركيب الدالة يتضح انها تبدء من آخر عنصر Len(S) الى الموقع الذي نريد العكس من عنده وهو Pos ثم نستخرج حرف بحرف وبحيث نستخرج الحرف الاخير ثم الذي قبله وهكذا وينتج في الاخير النص معكوس ...
والان دعنا نفكر كيف سنحولها الى صيغة الاستدعاء الذاتي ... اولاً وكما اسلفنا يجب التفكير في الشرط الذي سوف ننتهي عنده وذلك اعتماداً على المتغير المدخل وسوف نستخدم هنا المدخل Pos للفحص (كما استخدمنا المدخل N في المثال السابق ) ...
والفكرة التي سوف نستخدمها هنا هي اننا سوف نقوم بالعكس طالما الموقع Pos اصغر من موقع آخر عنصر بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]String
[/COLOR][color=#007700]If [/color][color=#0000bb]Pos [/color][color=#007700]<= [/color][color=#0000bb]Len[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700]) [/color][COLOR=#0000bb]Then
Rev [/COLOR][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]+ [/color][color=#0000bb]1[/color][color=#007700]) + [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]Pos[/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]حيث اننا فحصنا هنا انه اذا كان Pos اصغر من موقع آخر عنصر Len(S) بالتالي نستمر بالعكس .... ولكي نفهم الامر دعنا نتتبع المثال لنفرض ان الكلمة هي Rgheed ونريد عكسها من الحرف الاول فاننا سوف نكتب التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Print [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]من الواضح ان طول النص هو ستة حروف Len(S)=6 .... لاحظ ان الدالة كلها تعتمد على السطر :
كود :
[color=#000000][COLOR=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]+ [/color][color=#0000bb]1[/color][color=#007700]) + [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]Pos[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]اي انه اذا كانت قيمة الـ Pos هي واحد فان السطر السابق سوف يبدو كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
Rev [/COLOR][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]1 [/color][color=#007700]+ [/color][color=#0000bb]1[/color][color=#007700]) + [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]وهذا يعني
Rev [/COLOR][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700],[/color][color=#0000bb]2[/color][color=#007700]) + [/color][COLOR=#dd0000]"R"
[/COLOR][color=#0000bb][/color][/COLOR]لاحظ ان الحرف R جاء كناتج من الامر Mid(S,1,1)ويعني استخرج الحرف الاول ...
اما اذا كان الـ Pos=2 فان السطر سوف يبدو :
كود :
[COLOR=#000000][COLOR=#0000bb]
Rev [/COLOR][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]2 [/color][color=#007700]+ [/color][color=#0000bb]1[/color][color=#007700]) + [/color][color=#0000bb]Mid[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]2[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]وهذا يعني
Rev [/COLOR][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700],[/color][color=#0000bb]3[/color][color=#007700]) + [/color][COLOR=#dd0000]"g"
[/COLOR][color=#0000bb][/color][/COLOR]وهكذا الى ان يكون الـ pos اكبر من الستة عندها يكون الراجع من الدالة هو فراغ اي ان Rev="" وذلك لان الشرط If Pos <= Len(S) Then لن يتحقق وبالتالي سوف نخرج من الدالة مباشرة عند الخطوة السابعة ...
والخطوات كاملة سوف تكون كالتالي
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]2[/color][color=#007700]) + [/color][COLOR=#dd0000]"R"
[/COLOR][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]3[/color][color=#007700]) + [/color][COLOR=#dd0000]"g"
[/COLOR][color=#0000bb]3[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]4[/color][color=#007700]) + [/color][COLOR=#dd0000]"h"
[/COLOR][color=#0000bb]4[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]5[/color][color=#007700]) + [/color][COLOR=#dd0000]"e"
[/COLOR][color=#0000bb]5[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]6[/color][color=#007700]) + [/color][COLOR=#dd0000]"e"
[/COLOR][color=#0000bb]6[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#0000bb]Rev[/color][color=#007700]([/color][color=#dd0000]"Rgheed"[/color][color=#007700],[/color][color=#0000bb]7[/color][color=#007700]) + [/color][COLOR=#dd0000]"d"
[/COLOR][color=#0000bb]7[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][COLOR=#dd0000]""
[/COLOR][color=#0000bb][/color][/COLOR]بعد الوصول الى الخطوة الاخيرة ( الخطوة السابعة) فان قيمة الدالة عندها هي فراغ "" ويمكن هنا ان نأخذ هذة القيمة صعوداً ونعوض فيها بالخطوة السادسة ثم الناتج نعوضه في الخامسة وهكذا .. وسوف يكون الحل كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"deehg" [/color][color=#007700]+ [/color][color=#dd0000]"R" [/color][color=#007700]= [/color][COLOR=#dd0000]"deehgR"
[/COLOR][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"deeh" [/color][color=#007700]+ [/color][color=#dd0000]"g" [/color][color=#007700]= [/color][COLOR=#dd0000]"deehg"
[/COLOR][color=#0000bb]3[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"dee" [/color][color=#007700]+ [/color][color=#dd0000]"h" [/color][color=#007700]= [/color][COLOR=#dd0000]"deeh"
[/COLOR][color=#0000bb]4[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"de" [/color][color=#007700]+ [/color][color=#dd0000]"e" [/color][color=#007700]= [/color][COLOR=#dd0000]"dee"
[/COLOR][color=#0000bb]5[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"d" [/color][color=#007700]+ [/color][color=#dd0000]"e" [/color][color=#007700]= [/color][COLOR=#dd0000]"de"
[/COLOR][color=#0000bb]6[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][color=#dd0000]"" [/color][color=#007700]+ [/color][color=#dd0000]"d" [/color][color=#007700]= [/color][COLOR=#dd0000]"d"
[/COLOR][color=#0000bb]7[/color][color=#007700]) [/color][color=#0000bb]Rev [/color][color=#007700]= [/color][COLOR=#dd0000]""
[/COLOR][color=#0000bb][/color][/COLOR]وبالتالي فأن الناتج الذي يهمنا هو عند الخطوة الاولى اي النص المعكوس "deehgR" ... ويمكنك ان تجرب نصوص اخرى او تبدء من اي مكان في النص ...
------------
مثال آخر :
------------
لنفرض الان اننا نريد ان نقوم بالبحث في مصفوفة خطية اسمها A(8) مكونة من ثمانية عناصر ومحتوياتها كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
A[/COLOR][color=#007700]([/color][color=#0000bb]1[/color][color=#007700]) = [/color][COLOR=#0000bb]10
A[/COLOR][color=#007700]([/color][color=#0000bb]2[/color][color=#007700]) = [/color][COLOR=#0000bb]20
A[/COLOR][color=#007700]([/color][color=#0000bb]3[/color][color=#007700]) = [/color][COLOR=#0000bb]30
A[/COLOR][color=#007700]([/color][color=#0000bb]4[/color][color=#007700]) = [/color][COLOR=#0000bb]40
A[/COLOR][color=#007700]([/color][color=#0000bb]5[/color][color=#007700]) = [/color][COLOR=#0000bb]50
A[/COLOR][color=#007700]([/color][color=#0000bb]6[/color][color=#007700]) = [/color][COLOR=#0000bb]60
A[/COLOR][color=#007700]([/color][color=#0000bb]7[/color][color=#007700]) = [/color][COLOR=#0000bb]70
A[/COLOR][color=#007700]([/color][color=#0000bb]8[/color][color=#007700]) = [/color][COLOR=#0000bb]80
[/COLOR][/COLOR]والان لكي نقوم بعمل بحث عن اي عنصر في المصفوفة ابتداءً من موقع معين بحيث نرجع رقم الموقع الذي فيه العنصر او نرجع صفر في حال عدم وجود العنصر يمكن عندها كتابة دالة مثل هذة :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700]() As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]Item [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
Dim Max [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
Dim I [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
Max [/COLOR][color=#007700]= [/color][color=#0000bb]UBound[/color][color=#007700]([/color][color=#0000bb]A[/color][COLOR=#007700])
For [/COLOR][color=#0000bb]I [/color][color=#007700]= [/color][COLOR=#0000bb]Pos To Max
[/COLOR][color=#007700]If [/color][color=#0000bb]A[/color][color=#007700]([/color][color=#0000bb]I[/color][color=#007700]) = [/color][COLOR=#0000bb]Item Then
Find [/COLOR][color=#007700]= [/color][COLOR=#0000bb]I
[/COLOR][COLOR=#007700]Exit Function
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]Next I
End [/COLOR][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]في الدالة السابقة نقوم بتمرير المصفوفة والعنصر المراد البحث عنه Item وموقع البداية Pos ... خذ مثلاً :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Print [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](),[/color][color=#0000bb]60[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
Print [/COLOR][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](),[/color][color=#0000bb]20[/color][color=#007700],[/color][color=#0000bb]5[/color][COLOR=#007700])
Print [/COLOR][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](),[/color][color=#0000bb]45[/color][color=#007700],[/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]الناتج من السطر الاول هو 6 لان الموقع السادس في المصفوفة يساوي 60 اي ان A(6)=60 ولكن الناتج من السطر الثاني هو صفر فعلى الرغم من المصفوفة تحتوي على الرقم 20 في الموقع الثاني إلا اننا اخبرنا الدالة بان تبدء البحث من الموقع الخامس لهذا فأن الناتج هو 0 .... واما السطر الثالث فان الناتج فيه فهو صفر ايضاً وذلك لان العنصر 45 غير موجود بين عناصر المصفوفة A() .....
والان لكي نكتب المصفوفة بالشكل الذي نستخدم فيه الاستدعاء الذاتي يجب علينا اولاً ان نفكر بالشرط الذي يجب عنده الخروج .... وهو في هذة الحالة ان يتجاوز الموقع الذي نريد البحث فيه موقع آخر عنصر (Max=UBound(A) وفي هذة الحالة يكون الناتج من الدالة صفراً .... والشرط التالي ان يتم العثور على العنصر وفي هذة الحالة يخرج ايضاً ولكن مع ارجاع الموقع الذي عثر على العنصر فيه .. واما الشرط الثالث وهو في حالة ان العنصر غير موجود في الموقع الحالي ويوجد مواقع لم تتم زيارتها بعد فأن الدالة تستدعي نفسها ولكن مع زيادة الموقع Pos الى الموقع الذي يليه Pos+1 وبالتالي فأن الدالة قد تبدو بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700]() As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]Item [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]Pos [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
Dim Max [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
Dim I [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Integer
Max [/COLOR][color=#007700]= [/color][color=#0000bb]UBound[/color][color=#007700]([/color][color=#0000bb]A[/color][COLOR=#007700])
If [/COLOR][color=#0000bb]Pos [/color][color=#007700]> [/color][COLOR=#0000bb]Max Then
Find [/COLOR][color=#007700]= [/color][COLOR=#0000bb]0
[/COLOR][color=#007700]ElseIf [/color][color=#0000bb]A[/color][color=#007700]([/color][color=#0000bb]Pos[/color][color=#007700]) = [/color][COLOR=#0000bb]Item Then
Find [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Pos
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]Find [/color][color=#007700]= [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]Item[/color][color=#007700], [/color][color=#0000bb]Pos [/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]لنفترض الان اننا نبحث عن الرقم 60 من الموقع 1 فان الخطوات سوف تكون كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]3[/color][COLOR=#007700])
[/COLOR][color=#0000bb]3[/color][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]4[/color][COLOR=#007700])
[/COLOR][color=#0000bb]4[/color][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]5[/color][COLOR=#007700])
[/COLOR][color=#0000bb]5[/color][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]6[/color][COLOR=#007700])
[/COLOR][color=#0000bb]6[/color][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]6[/color][color=#007700]) = [/color][COLOR=#0000bb]6
[/COLOR][/COLOR]في المرة الاولى سوف يكون الموقع اصغر من الـ Max وكذلك لن يعتر على العنصر 60 في الموقع الاول لهذا سوف يتنقل الى الموقع التالي وهكذا الى ان يصل الى الموقع السادس وفيه سوف يجد العنصر 60 لهذا سوف يكون الراجع هي قيمة الـ Pos اي 6 في هذة الحالة ثم سوف يتم التعويض بالقيمة 6 في الخطوة الخامسة ثم الرابعة ثم الثالثة وهكذا حتى الاولى وبهذا يكون الناتج هو 6 ... اي ان الحل سوف يكون كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
1[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]1[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]2[/color][color=#007700]) = [/color][COLOR=#0000bb]6
2[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]2[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]3[/color][color=#007700]) = [/color][COLOR=#0000bb]6
3[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]3[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]4[/color][color=#007700]) = [/color][COLOR=#0000bb]6
4[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]4[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]5[/color][color=#007700]) = [/color][COLOR=#0000bb]6
5[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]5[/color][color=#007700]) = [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]6[/color][color=#007700]) = [/color][COLOR=#0000bb]6
6[/COLOR][color=#007700]) [/color][color=#0000bb]Find[/color][color=#007700]([/color][color=#0000bb]A[/color][color=#007700](), [/color][color=#0000bb]60[/color][color=#007700], [/color][color=#0000bb]6[/color][color=#007700]) = [/color][COLOR=#0000bb]6
[/COLOR][/COLOR]وبنفس الطريقة يمكن التجربة عندما يكون العدد غير موجود في المصفوفة فانه سوف يصل الى الحالة الاخيرة التي يكون فيها Pos اكبر من Max وبهذا يتم ارجاع القيمة صفر ويتم التعويض بالقيمة صفر في الخطوات الى الخطوة الاولى ويكون عندها الراجع هو صفر ويعني ان العنصر غير موجود ...
لاحظ ان استخدام الدالة Find السابقة بدون الاستدعاء الذاتي كان اكثر كفائة من الحالة التي استخدمنا فيها الاستدعاء الذاتي لعدة اسباب منها اننا في حالة الاستدعاء الذاتي قمنا بعمليات فحص اكثر ... اي شرطان بدل الشرط الواحد بدون الاستدعاء الذاتي :
1-هل Pos اكبر من Max
2-هل A(Pos)=Item
كما ان العبارة Max=Ubound(A) يتم تنفيذها مرة واحدة (بدون الاستدعاء الذاتي) واما في حالة الاستدعاء الذاتي فانه يتم تنفيذها بعدد المرات التي يتم استدعاء الدالة فيها ... (طبعاً يمكن تلافي ذلك بتمرير القيمة العظمى للمصفوفة بدلاً من حسابها يدوياً ) ....
على الرغم العيوب السابقة فانه يمكن تحسين البحث ولكني هنا اعتمد التبسيط لهذا فأن تركيزنا هو كيف يعمل الاستدعاء الذاتي وكيف تتمكن من تتبع الدوال التي كتبت بصيغة الاستدعاء الذاتي ....
--------------------
حالات اكثر تعقيداً :
--------------------
لاحظنا في الامثلة السابقة ان جميع الحالات تم فيها استدعاء الدالة مرة واحدة فقط اي انه في كل استدعاء للدالة فانها تستدعي نفسها مرة واحدة ولكن يوجد حالات تقوم الدالة فيها باستدعاء نفسها اكثر من مرة وهنا تكمن قوة الاستدعاء الذاتي وسوف اضرب اكثر الامثلة شهرة في هذا المجال وهي حساب سلسلة Fibonacci و هذة السلسلة لها معادلة
خاصة حيث ان كل عنصر فيها هو عبارة عن مجموع العنصرين اللذان يسبقانه في هذة السلسلة وهي كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
0 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
1 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
2 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]2
3 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]3
4 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]5
5 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]8
6 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]13
7 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]21
8 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]34
9 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]55
[/COLOR][color=#007700]: [/color][COLOR=#0000bb]وهكذا
[/COLOR][COLOR=#007700]:
[/COLOR][color=#0000bb][/color][/COLOR]فاذا نظرت الى العنصر رقم 6 مثلاً فانه عبارة عن جمع العنصر رقم 5 (الذي يساوي 8) والعنصر رقم 4 (الذي يساوي 5) وبالتالي فان العنصر رقم 6 يساوي 13 ....
كود :
[COLOR=#000000][COLOR=#0000bb]
Fib[/COLOR][color=#007700]([/color][color=#0000bb]6[/color][color=#007700])=[/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]5[/color][color=#007700])+[/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]4[/color][COLOR=#007700])
[/COLOR][color=#0000bb][/color][/COLOR]وينطبق هذا الوضع على جميع العناصر ماعدا العنصرين رقم صفر ورقم واحد فكلاهما يحملان القيمة 1 ...
يتضح مما سبق انه اذا كانت اسم الدالة مثلاً Fib فان Fib(N) تساوي 1 اذا كان N =0 او N=1 وغير ذلك فان Fib(N)= Fib(N-1)+Fib(N-2) .... بالشكل التالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]|= [/color][color=#0000bb]1 N[/color][color=#007700]<=[/color][COLOR=#0000bb]1
Fib[/COLOR][color=#007700]([/color][color=#0000bb]N[/color][color=#007700]) |= [/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]N[/color][color=#007700]-[/color][color=#0000bb]1[/color][color=#007700])+[/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]N[/color][color=#007700]-[/color][color=#0000bb]2[/color][color=#007700]) [/color][color=#0000bb]N[/color][color=#007700]>[/color][COLOR=#0000bb]1
[/COLOR][/COLOR]لهذا فأن كتابة دالة الاستدعاء الذاتي سيكون بسيطاً جداً بينما اذا فكرت في بنائه بدون استدعاء ذاتي فان هذا سيكون مرهقاً ....
والدالة هي كالتالي :
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Function [/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
[/COLOR][color=#007700]If [/color][color=#0000bb]N [/color][color=#007700]<= [/color][COLOR=#0000bb]1 Then
Fib [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]Fib [/color][color=#007700]= [/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]1[/color][color=#007700]) + [/color][color=#0000bb]Fib[/color][color=#007700]([/color][color=#0000bb]N [/color][color=#007700]- [/color][color=#0000bb]2[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function
[/COLOR][color=#0000bb][/color][/COLOR]---------
خاتمة :
---------
مما سبق يمكن رؤية ان استخدام الاستدعاء الذاتي بالشكل الصحيح سوف يمكنك من تبسيط المسائل البرمجية المعقدة خاصة وان معظم الخوارزميات او اللوغارتيمات القوية تستخدم تقنية الاستدعاء الذاتي بشكل اساسي فيها مثل لوغارتيمات الفرز السريع ومن اشهرها QuickSort الذي يستخدم تقنية الاستدعاء الذاتي لتنفيذ مبدأ فرق تسد (Divide And Conquer) وهو من المبادئ المهمة في تصميم اللوغارتيمات كما ان معظم لوغارتيمات ضغط الملفات و البحث في القرص الصلب تستفيد كثيراً من هذة التقنية في عملها ...
اتمنى للجميع حظاً موفقاً و السلام عليكم ورحمة الله وبركاته ...
