تتيح استدعاء وظيفة العودية الذيل للمترجم بإجراء تحسين خاص لا يمكنه عادةً مع عودة منتظمة. في وظيفة العودية الذيل ، فإن المكالمة العودية هي آخر شيء يتم تنفيذه. في هذه الحالة ، بدلاً من تخصيص إطار مكدس لكل مكالمة ، يمكن للمترجم إعادة صياغة الكود ببساطة لإعادة استخدام إطار المكدس الحالي ، مما يعني أن الوظيفة التي تلتزمها التيل ستستخدم فقط إطار مكدس واحد بدلاً من المئات أو حتى الآلاف.
هذا التحسين ممكن لأن المترجم يعلم أنه بمجرد إجراء المكالمة العودية الذيل ، لن تكون هناك حاجة إلى نسخ سابقة من المتغيرات ، لأنه لا يوجد رمز مزيد من التنفيذ. على سبيل المثال ، إذا اتبعت عبارة طباعة مكالمة متكررة ، فسوف يحتاج المترجم إلى معرفة قيمة المتغير المراد طباعته بعد إرجاع المكالمة العودية ، وبالتالي لا يمكن إعادة استخدام إطار المكدس.
إليك صفحة Wiki إذا كنت ترغب في مزيد من المعلومات حول كيفية عمل "حفظ المساحة" وإعادة استخدام المكدس فعليًا ، إلى جانب أمثلة: نداء الذيل
تحرير: لم أشرح كيف ينطبق هذا على Quicksort ، أليس كذلك؟ حسنًا ، يتم طرح بعض المصطلحات في هذه المقالة التي تجعل كل شيء مربكًا (وبعضها خطأ واضح). تقوم الوظيفة الأولى المعطاة (Quicksort) بإجراء مكالمة متكررة على اليسار ، ومكالمة عودية على اليمين ، ثم تخرج. لاحظ أن المكالمة العودية على اليمين هي آخر شيء يحدث في الوظيفة. إذا كان المترجم يدعم التحسين العودية الذيل (موضح أعلاه) ، فإن المكالمات اليسرى فقط تنشئ إطارات مكدس جديدة ؛ كل المكالمات الصحيحة فقط أعد استخدام الإطار الحالي. هذا يمكن أن ينقذ بعض إطارات المكدس ، ولكن لا يزال من الممكن أن تعاني من الحالة التي يخلق فيها التقسيم سلسلة من المكالمات حيث لا يهم تحسين عوائق الذيل. بالإضافة إلى ذلك ، على الرغم من أن المكالمات اليمنى تستخدم نفس الإطار ، إلا أن المكالمات اليسرى تسمى داخل لا تزال المكالمات اليمنى تستخدم المكدس. في أسوأ الحالات ، يكون عمق المكدس N.
النسخة الثانية الموصوفة ليس ذيل العودية السريعة ، ولكن بالأحرى مدونة سريعة حيث يتم الفرز الأيسر فقط بشكل متكرر ، ويتم الفرز الأيمن باستخدام الحلقة. في الواقع ، لا يمكن أن يكون هذا التحسين السريع (كما هو موضح سابقًا من قبل مستخدم آخر) هو تحسين عودة الذيل ، لأن المكالمة العودية ليست آخر شيء يتم تنفيذه. كيف يعمل هذا؟ عند تنفيذها بشكل صحيح ، تكون المكالمة الأولى إلى QuickSort هي نفس المكالمة اليسرى في الخوارزمية الأصلية. ومع ذلك ، لا تسمى أي مكالمات متكررة في الجانب الأيمن. كيف يعمل هذا؟ حسنًا ، تعتني الحلقة بذلك: بدلاً من فرز "اليسار ثم يمينًا" ، تقوم بفرز اليسار بمكالمة ، ثم يقوم بفرز اليمين باستمرار فقط يسار اليمين. إنه لأمر مثير للسخرية حقًا ، لكنه في الأساس مجرد فرز الكثير من اليسار بحيث تصبح الحقوق عناصر واحدة ولا تحتاج إلى فرزها. هذا يزيل بشكل فعال العودية الصحيحة ، مما يجعل الوظيفة أقل عودية (عودية زائفة ، إذا صح التعبير). ومع ذلك ، فإن التنفيذ الحقيقي لا يختار فقط الجانب الأيسر في كل مرة ؛ يختار أصغر جانب. الفكرة لا تزال هي نفسها. إنها تقوم بشكل أساسي فقط بإجراء مكالمة متكررة على جانب واحد بدلاً من كليهما. سيضمن اختيار الجانب الأقصر أن عمق المكدس لا يمكن أن يكون أكبر من Log2 (n) ، وهو عمق شجرة ثنائية مناسبة. وذلك لأن الجانب الأقصر سيكون دائمًا نصف حجم قسم الصفيف الحالي. لا يضمن التنفيذ الذي قدمته المقالة ذلك ، لأنه يمكن أن يعاني من نفس سيناريو الحالات الأكثر سوءًا لـ "اليسار هو الشجرة بأكملها". يقدم هذا المقال في الواقع شرحًا جيدًا لذلك إذا كنت على استعداد للقيام بالمزيد من القراءة: اختيار فعال وفرز جزئي على أساس Quicksort