التعاود

لقد ذكرت في الفصل السابق أنه يسمح لعملية ما أن تستدعي عملية أخرى، كما رأينا عدة أمثلة على ذلك. لقد أغفلت ذكر مشروعية استدعاء العملية لنفسها أيضاً. إن السبب الذي يجعل من هذه الإمكانية شيئاً جيداً قد لا يكون واضحاً، لكنه واحد من أكثر الأشياء التي تستطيع البرامج عملها سحراً وإثارة.
مثلاً، انظر إلى العملية التالية:
كود:
public static void countdown (int n) {
  if (n == 0)
    System.out.println ("Blastoff!");
  } else {
    System.out.println (n);
    countdown (n-1);
  }
}
اسم العملية هو countdown وهي تأخذ عدد صحيح واحد كمعامل. إذا كان المعامل صفراً، فستطبع الكلمة "!Blastoff". وإلا، فستطبع العدد ثم تستدعي عملية اسمها countdown – نفسها– وتمرر لها n-1 كمعامل.
ماذا يحدث لو استدعينا هذه العملية في main، هكذا مثلاً:
كود:
countdown (3);
يبدأ تنفيذ countdown مع n=3، وبما أن n ليس صفراً، تطبع العملية القيمة 3، ثم تستدعي نفسها...
يبدأ تنفيذ countdown مع n=2، وبما أن n ليس صفراً، تطبع العملية القيمة 2، ثم تستدعي نفسها...
يبدأ تنفيذ countdown مع n=1، وبما أن n ليس صفراً، تطبع العملية القيمة 1، ثم تستدعي نفسها...
يبدأ تنفيذ countdown مع n=0، وبما أن n صفر، ستطبع العملية الكلمة "!Blastoff" وبعدها ترجع إلى العملية السابقة.
ترجع العملية countdown ذات المتحول n=1.
ترجع العملية countdown ذات المتحول n=2.
ترجع العملية countdown ذات المتحول n=3.
وبعدها تجد نفسك في main ثانية (يا لها من رحلة). ويكون الخرج النهائي للبرنامج كما يلي:
3
2
1
Blastoff!
كمثال آخر، دعنا ننظر ثانية إلى العمليتين newLine وthreeLine.
كود:
public static void newLine () {
  System.out.println ("");
}
public static void threeLine () {
  newLine (); newLine (); newLine ();
}
بالرغم من أنهما تعملان، إلا أنهما لن تكونا مفيدتين فعلاً إذا أردت طباعة سطرين جديدين، أو 106. إن حلاً أفضل سيكون مثل هذا:
كود:
public static void nLines (int n) {
  if (n > 0) {
    System.out.println ("");
    nLines (n-1);
  }
}
هذا البرنامج شبيه جداً بالسابق؛ طالما أن n أكبر من الصفر، سيطبع سطراً جديداً واحداً، ثم يستدعي نفسه لطباعة n-1 سطر إضافي. بالتالي، فإن العدد الكلي للأسطر المطبوعة سيكون 1 + (n-1)، وهو عادة ما يساوي إلى n تقريباً.
إن استدعاء العملية لنفسها يدعى بالتعاود (recursion ومثل هذه العمليات تدعى تعاودية (recursive).