عودية

[يسار|تصغير|250بك|[مثلث سيربنسكي - استدعاء ذاتي لمثلثات لتشكيل مشبك هندسي.]][تصغير|شكل بصري للاستدعاء الذاتي يعرف ب''[تأثير دروست*. تحمل المرأة في الصورة جسم الذي يحتوي على صورة أصغر لها وهي حاملة نفس الجسم، والذي بدوره يحتوي على صورة أصغر لها وهي حاملة نفس الجسم، وهكذا.]]

*'العَوْدية**  هي عملية تكرار الشيء بطريقة مشابهة ذاتيا. على سبيل المثال، عندما يكون سطحا مرآتين متوازيين تماماً مع بعضها البعض الصور المتداخلة هي عبارة عن نوع من استدعاء ذاتي لانهائي. للمصطلح معانٍ متنوعة خاصة لمجموعة منوعة من التخصصات من [[لسانيات|اللغويات]] إلى [[المنطق]]. الاستعمال الأكثر شيوعاً للعودية هو في [[رياضيات|الرياضيات]] [[عودية (علم الحاسوب)|وعلم الحاسوب]]، حيث أنه يشير إلى طريقة لتعريف [[دالة|دوال]] بحيث أن الدالة المعرفة تُستعمل في تعريف نفسها.

يجب أن تمتلك دالة الاستدعاء الذاتي على خطوتين أساسيتين:

1- وجود شرط توقف معرف بشكل صحيح مثل:

If (x<=1) return 1 

 بدون هذه الخطوة يستمر الاستدعاء إلى مالا نهاية.

2- وجود خطوة الاستدعاء الذاتي التي يجب أن تعرف بشكل صحيح بحيث تؤدي إلى حالة توقف مثل:

(Return x*factorial(x-1

== تعريفات رسمية للعودية ==
في [[رياضيات|الرياضيات]] و[[علم الحاسوب]]، تظهر فئة من الكائنات أو الأساليب سلوك استدعاء ذاتي عندما يكون بالإمكان تعريفهم عن طريق خاصيتين:
* حالة أساس بسطية (أو عدة حالات)، و
* مجموعة من القواعد التي تقلص كل الحالات الأخرى نحو حالة الأساس.

مثلا، التعريف بالاستدعاء الذاتي التالي هو تعريف لأسلاف شخص:
* والدا شخص هم أسلافه (حالة الأساس)
* والدا أسلاف شخص هم أيضا أسلافه (خطوة الاستدعاء الذاتي).

[[عدد فيبوناتشي|متتالية فيبوناتشي]] هي مثال تقليدي للاستدعاء الذاتي:
* (Fib(0 هو 0 [حالة أساس]
* (Fib(1 هو 1 [حالة أساس]
* لكل الأعداد الصحيحة n> 1:
 (Fib(n هو ((Fib(n-1) + Fib(n-2) [تعريف بالاستدعاء الذاتي]

العديد من البديهيات مبنية على قواعد استدعاء ذاتي. مثلا، التعريف الرسمي [[عدد طبيعي|للأعداد الطبيعية]] في [[نظرية المجموعات]] هو: ''1 هو عدد طبيعي، ولكل عدد طبيعي عدد لاحق، والذي هو بحد ذاته عدد طبيعي.'' باستخدام حالة الأساس وقاعدة عود، بالإمكان إنتاج مجموعة كل الأعداد الطبيعية.

توضيح فكاهي يقول: «''لكي تفهم الاستدعاء الذاتي، يجب عليك فهم الاستدعاء الذاتي''». أو ربما بصورة أدق، من أندرو بلوتكين: «''إذا كنت تعرف ما هو الاستدعاء الذاتي، تذكر الجواب فقط. وإلا، جد شخصاً يقف أقرب إلى [[دوغلاس هوفشتادتر]] منك; ثم إساله أو إسالها ما هو الاستدعاء الذاتي.''»

كائنات معرفة بالاستدعاء الذاتي تشتمل على [[دالة|الدوال]]، [[مجموعة (توضيح)|المجموعات]] وخاصة [[كسيرة|الكسيريات]].

== فكاهات الاستدعاء الذاتي ==
يتم استخدام الاستدعاء الذاتي بشكل فكاهي في علم الحاسوب، البرمجة، الفلسفة، أو كتب الرياضايات المدرسية; المثالان التاليان قد تكون تعريفات في القاموس:


:**استدعاء ذاتي**
::راجع «استدعاء ذاتي».
:**استدعاء ذاتي**
::إذا لم تزل تعرفه، راجع «استدعاء ذاتي».

مثال آخر يوجد في فهرس في صفحة 269 في بعض نسخ كتاب [[براين كيرنيغان|كيرنيغان]] و[[دينيس ريتشي|ريتشي]] «<nowiki/>[[لغة البرمجة سي (كتاب)|لغة البرمجة سي]]»; فإن الفهرس يشير باستدعاء ذاتي إلى نفسه:استعاء ذاتي 86. 139. 141. 182. 202. **269.**

فكاهة مشابهة تظهر في النسخة الإنجليزية من محرك بحث [[جوجل]]: عندما تبحث عن recursion، يقترح الموقع «<span style="color:red">هل تقصد:</span> ''[http://www.google.com/search?q=recursion Recursion]''».

اختصارات الاستدعاء الذاتي تمكن أن تكون نوع من الفكاهة في الاستدعاء الذاتي. بعض الأمثلة:
* [[بي إتش بي]] هي اختصار لـ "PHP Hypertext Preprocessor".
* [[واين (برنامج)|WINE]] هي اختصار لـ "Wine Is Not an Emulator.
* [[جنو|GNU]] هي اختصار لـ "GNU's Not Unix"

== الاستدعاء الذاتي في الرياضيات ==
[[ملف:SierpinskiTriangle.svg|يسار|تصغير|250بك|[[مثلث سيربنسكي]] - استدعاء ذاتي لمثلثات لتشكيل [[مشبك (زمرة)|مشبك]] هندسي.]]
=== المجموعات المعرفة بالاستدعاء الذاتي ===
==== مثال: الأعداد الطبيعية ====
المثال القانوني للمجموعات المعرفة بالاستدعاء الذاتي هو [[عدد طبيعي|الأعداد الطبيعية]]:

:1 في <math>\mathbb{N}</math>
:إذا كان ''n'' في <math>\mathbb{N}</math>، إذن ''n'' + 1 في <math>\mathbb{N}</math>
:مجموعة الأعداد الطبيعية هي المجموعة الأصغر التي تحقق الخاصتين السابقين.

=== دوال الاستدعاء الذاتي ===
[[دالة]] قد تكون معرفة جزئياً بنفسها. مثال مألوف هو [[عدد فيبوناتشي|متتالية فيبوناتشي]]: (F(n) = F(n − 1) + F(n − 2.
ليكون التعريف مفيداً، يجب أن يوصل إلى قيم غير معرفة بالاستدعاء الذاتي، في هذه الحالة F(0) == 0 و F(1) == 1.

[[دالة اكرمن]] هي دالة استدعاء ذاتي مشهورة، والتي بخلاف متتالية فيبوناتشي، لا يمكن التعبير عنها بدون الاستدعاء الذاتي.

== الاستدعاء الذاتي في علم الحاسوب ==


طريقة شائعة لتبسيط المسائل هي لتقسيم المسألة إلى مسائل جزئية من نفس النوع. كتقنية [[برمجة]]، يطلق عليها [[خوارزمية فرق تسد|فرق تسد]] وهي المفتاح لتصميم العديد من الخوارزميات المهمة. فرق تسد هي عبارة عن نهج لحل المسائل من الأعلى إلى الأسفل، بحيث يتم حل المسائل عن طريق حل نسخ أصغر من المسألة. نهج معاكس هي [[برمجة ديناميكية]]. هذا النهج عبارة عن نهج لحل المسائل من الأسفل إلى الأعلى، بحيث يتم حل المسائل عن طريق حل نسخ أكبر من المسألة، حتى يتم الحصول على الحجم المطلوب.

مثال تقليدي للاستدعاء الذاتي هو تعريف دالة [[عاملي|العاملي]]، مثال بلغلة السي:

<syntaxhighlight lang="c">
unsigned int factorial(unsigned int n) 
{
  if (n <= 1) 
    return 1;
  else
    return n * factorial(n-1);
}
</syntaxhighlight>

تستدعي الدالة نفسها عودياً على نسخة أصغر من المدخل (n-1) وتضرب نتيجة الاستدعاء الذاتي بـ n، حتى تصل إلى حالة الأساس، بشكل مماثل للتعريف الرياضي للعاملي.

مثال تقليدي اخر بلغه السي بلس بلس:<syntaxhighlight lang="c++">

#include <iostream>

using namespace std;

int main ()

{

long number;

cout << "Please type a number: ";

cin >> number;

cout << number << "! = " << factorial (number);

return 0;

</syntaxhighlight>في المثال السابق قمنا بكتابة إستدعاء ذاتى للدالة، أي الدالة قامت بمناداة نفسها من داخلها.

لاستخدام الاستدعاء الذاتي في خوارزمية إيجابيات وسلبيات. الميزة الرئيسية هي عادةً البساطة. الضرر الرئيسي هو غالباً أن الخوارزمية قد تستلزم كمية كبيرة من الذاكرة إذا كان عمق الاستدعاء الذاتي كبير جداً.

== مبرهنة الاستدعاء الذاتي ==
في [[نظرية المجموعات]]، هذه مبرهنة التي تضمن وجود دوال معرفة بالاستدعاء الذاتي. بإعطاء مجموعة X، عنصر a في X ودالة <math>f: X \rightarrow X</math>، تنص المبرهنة أنه هنالك دالة مميزة <math>F: \mathbb{N} \rightarrow X</math> (حيث أن <math>\mathbb{N}</math> ترمز مجموعة الأعداد الطبيعية شاملة الصفر) بحيث أن:<math>F(0) = a</math>
:<math>F(n + 1) = f(F(n))</math>
لأي عدد طبيعي n.

=== برهان التميز ===

لتكن <math>F: \mathbb{N} \rightarrow X</math> و<math>G: \mathbb{N} \rightarrow X</math> دالتين بحيث أن:

:<math>F(0) = a</math>
:<math>G(0) = a</math>
:<math>F(n + 1) = f(F(n))</math>
:<math>G(n + 1) = f(G(n))</math>

بحث أن ''a'' هو عنصر في ''X''.

بالإمكان البرهنة ب[[استقراء رياضي|الاستقراء]] أن <math>F(n) = G(n)</math> لكل الأعداد الطبيعية ''n'':

:**الأساس**: <math>F(0) = a = G(0)</math> وبالتالي فإن المساواة تنطبق أيضا على <math>n = 0</math>.

:**خطوة الاستقراء''': لنفرض أن F(k) = G(k) لبعض k \in \mathbb{N}. إذن F(k+1) = f(F(k)) = f(G(k)) = G(k+1).
::ومن هنا F(k) = G(k) يؤدي إلى F(k+1) = G(k+1).

بالاسقراء , F(n) = G(n) لكل n \in \mathbb{N}.

### أمثلة
بعض العلاقات العودية الشائعة:

* نسبة ذهبية: (φ == 1 + (1/φ... بتذكر أن (φ = 1 + (1/φ ثم... (.../φ == 1 + (1/(1+(1/1+1
* عاملي: n! = n (n - 1)! = n (n - 1)\cdots 1
* متتالية فيبوناتشي: f (n) = f (n - 1) + f (n - 2)
* أعداد كاتالان: C_0=1, C_{n+1} = (4n+2)C_n/(n+2)
* حساب الفائدة المركبة
* برج هانوي
* دالة اكرمن

## طالع أيضًا

* العودية اليسرى
* عودية (علم الحاسوب)

## مراجع

*
تصنيف:ارتجاع
تصنيف:الإشارة إلى الذات
تصنيف:النظرية الحسابية