أمثلة على Recursion .. ” الاستدعاء الذاتي في هياكل البيانات “
ماهي تقنية الاستدعاء الذاتي Recursion
إن الوظائف التك”(3603)” “الوظائف المتكررة أو الاستدعاء الذاتي تنتمي إلى أنواع الخوارزميات البرمجية، حيث تعرف الوظيفة العودية في مصطلحات البرمجة بأنها إجراء يستدعي نفسه بشكل مباشر أو غير مباشر. يتم استخدام الخوارزمية العودية أو الاستدعاء الذاتي لحل المشكلات بسهولة. المعنى الحرفي للوظائف المتكررة هو الاستدعاء الذاتي، حيث تقوم الطرق بدعوة نفسها بنفسها. تحتوي هذه الطرق على هيكلية وأساسيات خاصة بها.
أمثلة على Recursion
يتم استخدام عدة طرق لكتابة الاستدعاء التكراري، بما في ذلك الطريقة المباشرة والطريقة غير المباشرة، وسنتحدث عن أبراج كود هانوي كمثال على الاتصال المباشر وكيفية تنفيذه بعدة لغات
أمثلة على الطريقة المباشرة بلغة++C
#include <bits/stdc++.h>
using
namespace
std;
// Assuming n-th disk is bottom disk (count down)
void
tower(
int
n,
char
sourcePole,
char
destinationPole,
char
auxiliaryPole)
{
// Base case (termination condition)
if
(0 == n)
return
;
// Move first n-1 disks from source pole
// to auxiliary pole using destination as
// temporary pole
tower(n - 1, sourcePole, auxiliaryPole,
destinationPole);
// Move the remaining disk from source
// pole to destination pole
cout <<
"Move the disk "
<< n <<
" from "
<<
sourcePole <<
" to "
<< destinationPole << endl;
// Move the n-1 disks from auxiliary (now source)
// pole to destination pole using source pole as
// temporary (auxiliary) pole
tower(n - 1, auxiliaryPole, destinationPole,
sourcePole);
}
// Driver code
int
main()
{
tower(3,
"S"
,
"D"
,
"A"
);
return
0;
}
// This code is contributed by SHUBHAMSINGH10
أمثلة على الطريقة المباشرة بلغة الجافا
// Assuming n-th disk is
// bottom disk (count down)
class
GFG {
static
void
tower(
int
n,
char
sourcePole,
char
destinationPole,
char
auxiliaryPole)
{
// Base case (termination condition)
if
(
0
== n)
return
;
// Move first n-1 disks from source pole
// to auxiliary pole using destination as
// temporary pole
tower(n -
1
, sourcePole, auxiliaryPole,
destinationPole);
// Move the remaining disk from source
// pole to destination pole
System.out.printf(
"Move the disk %d from %c to %cn"
,
n, sourcePole, destinationPole);
// Move the n-1 disks from auxiliary (now source)
// pole to destination pole using source pole as
// temporary (auxiliary) pole
tower(n -
1
, auxiliaryPole, destinationPole, sourcePole);
}
public
static
void
main(String[] args)
{
tower(
3
,
"S"
,
"D"
,
"A"
);
}
}
// This code is contributed by Smitha Dinesh Semwal.
# Assuming n-th disk is
# bottom disk (count down)
def
tower(n, sourcePole, destinationPole, auxiliaryPole):
# Base case (termination condition)
if
(
0
=
=
n):
return
# Move first n-1 disks
# from source pole
# to auxiliary pole
# using destination as
# temporary pole
tower(n
-
1
, sourcePole, auxiliaryPole, destinationPole)
# Move the remaining
# disk from source
# pole to destination pole
print
(
"Move the disk"
,sourcePole,
"from"
,sourcePole,
"to"
,destinationPole)
# Move the n-1 disks from
# auxiliary (now source)
# pole to destination pole
# using source pole as
# temporary (auxiliary) pole
tower(n
-
1
, auxiliaryPole, destinationPole,sourcePole)
# Driver code
tower(
3
,
"S"
,
"D"
,
"A"
)
الاستدعاء الذاتي بلغة c
الوظيفة التي تستدعي فيها الوظيفة نفسها تسمى بالوظيفة العودية، وتسمى الوظيفة المقابلة، وفي لغة ++C، فإن الوظيفة العودية يمكن فهمها بشكل أفضل من خلال دالة المشغل، التي يتجلى وجودها في:
f (n) = n * f (n-1) ، الشرط الأساسي: إذا كان n ≤ 1 ، فإن f(n) = 1.
تستخدم العودية لتقسيم المشكلة إلى مشاكل أصغر حتى تتمكن من الوصول إلى الحالة الأساسية، ويتم ذلك من خلال استخدام دالة عاملية f(n).
أنواع تقنية الاستدعاء الذاتي
تتكون تقنية الاستدعاء الذاتي من نوعين، حيث يتم استدعاء الوظيفة من داخل نفسها أو استدعاء عدة وظائف، ويتميز نوعا تقنية الاستدعاء الذاتي بالآتي:
-الاستدعاء الذاتي المباشر
وتصنف إلى أربعة أنواع وتتجلى في:
- استدعاء الذاتي الذيلي هو عبارة عن استدعاء للدالة نفسها، حيث يكون هذا الاستدعاء هو آخر عبارة في الدالة، وبعد هذا الاستدعاء، لا تنفذ الدالة أي إجراءات إضافية، ويجب على الدالة أن تقوم بالمعالجة أو العمل في وقت الاستدعاء.
- يعرف الاستدعاء الذاتي الرأسي Head Recursion عندما تستدعي الدالة نفسها في العبارة الأولى من الدالة، ولا توجد أي عبارة أو عملية قبل هذا الاستدعاء، ولا يتطلب الدالة أي معالجة أو تنفيذ عملية في وقت الاستدعاء، بل يتم تنفيذ جميع العمليات في وقت الإرجاع.
- الاستدعاء الذاتي الشجري هو استدعاء دالة لنفسها عدة مرات، ويختلف عن الاستدعاء الذاتي الخطي حيث يتم استدعاء الدالة لنفسها مرة واحدة فقط.
- الاستدعاء الذاتي الخطي هو عبارة عن دالة تستدعي نفسها مرة واحدة فقط، ويتم ذلك في كل تشغيل للدالة.
-الاستدعاء الذاتي الغير مباشر
في الاستدعاء الذاتي غير المباشر، يتم ربط دوال مختلفة ببعضها البعض بشكل دائري، وذلك يعني استدعاء وظيفة معينة بشكلغير مباشر من وظيفة أخرى.
مزايا وخصائص الاستدعاء الذاتي
إن خصائص الاستدعاء الذاتي تتجلى في:
- الوظيفة التكرارية أو الاستدعاء الذاتي هي وظيفة تقوم بإستدعاء نفسها.
- تكون سرعة الاستجابة الذاتية أبطأ بسبب الأعباء المتراكمة.
- يجب أن تتضمن وظيفة الاستدعاء الذاتي شروطًا للانتهاء أو حالة أساسية، بالإضافة إلى تضمين تعبيرات متكررة.
بينما مزايا الاستدعاء الذاتي تتجلى في:
- إنه يجعل البرنامج نظيفاً.
- يساعد على تبسيط التعليمات البرمجية المعقدة والمتداخلة.
بينما مساوئ الاستدعاء الذاتي تتجلى في :
- من الصعب أن يتم تصحيح الأخطاء.
- من الصعب أن يتم فهم المنطق.