سؤال

هل هناك الأداء ضرب إذا نحن نستخدم حلقة بدلا من العودية أو العكس في الخوارزميات على حد سواء حيث يمكن أن تخدم نفس الغرض ؟ على سبيل المثال:تحقق من أن سلسلة سياق متناظر.لقد رأيت العديد من المبرمجين استخدام العودية كوسيلة لاظهار عندما بسيط التكرار خوارزمية يمكن أن تناسب مشروع القانون.هل المترجم تلعب دورا حيويا في تحديد ما يجب استخدامه ؟

هل كانت مفيدة؟

المحلول

فمن الممكن أن الإعادة ستكون أكثر تكلفة ، اعتمادا على ما إذا كان وظيفة العودية هو ذيل العودية (السطر الأخير هو دعوة متكررة).ذيل العودية يجب أن تكون معترف بها من قبل المترجم الأمثل إلى تكرارية نظيره (مع الحفاظ على موجزة تنفيذ واضحة لديك في التعليمات البرمجية الخاصة بك).

أود أن أكتب الخوارزمية في الطريق الذي يجعل معظم معانيها و هو أوضح للفقراء مصاصة (سواء كان لنفسك أو لشخص آخر) أن لديه للحفاظ على الرمز في بضعة أشهر أو سنوات.إذا واجهت مشكلات في الأداء ، ثم ملف التعريف الخاص بك التعليمات البرمجية ثم وبعد ذلك فقط ننظر إلى الاستفادة المثلى من خلال الانتقال إلى تكرارية التنفيذ.قد ترغب في النظر في التحفيظ و البرمجة الديناميكية.

نصائح أخرى

الحلقات يمكن تحقيق كسب الأداء للبرنامج الخاص بك.العودية يمكن تحقيق كسب الأداء الخاص بك مبرمج.اختيار الذي هو أكثر أهمية في الوضع الخاص بك!

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

بعض الخوارزميات فقط تصلح العودية بسبب الطريقة أنها مصممة (تسلسل فيبوناتشي ، تعبر شجرة مثل هيكل ، إلخ.).العودية يجعل خوارزمية أكثر إيجازا و أسهل للفهم (ولذلك للمشاركة و قابلة لإعادة الاستخدام).

أيضا, بعض الخوارزميات العودية استخدام "كسول التقييم" مما يجعلها أكثر كفاءة من تكرارية الإخوة.وهذا يعني أنها تفعل سوى تكلفة العمليات الحسابية في وقت الحاجة إليهم بدلا من كل مرة حلقة أشواط.

وينبغي أن يكون كافيا للحصول على انك بدأته.سأبحث عن بعض المقالات و الأمثلة أنت أيضا.

الرابط 1: Haskel مقابل PHP (العودية مقابل التكرار)

هنا هو مثال حيث مبرمج أن العملية مجموعة كبيرة من البيانات باستخدام PHP.انه يظهر كيف سيكون من السهل التعامل معها في Haskel استخدام العودية ، ولكن منذ PHP لديه طريقة سهلة لتحقيق نفس الأسلوب ، واضطر إلى استخدام التكرار للحصول على النتيجة.

http://blog.webspecies.co.uk/2011-05-31/lazy-evaluation-with-php.html

رابط 2: اتقان العودية

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

"العودية البرمجة يعطي مبرمج أفضل طريقة لتنظيم التعليمات البرمجية في الطريق الذي هو على حد سواء للصيانة و متسقة منطقيا."

https://developer.ibm.com/articles/l-recurs/

الرابط 3: هو العودية أسرع من أي وقت مضى من حلقات?(الجواب)

هنا هو ارتباط إلى إجابة عن ستاكوفيرفلوو مسألة مماثلة ليدكم.ويشير صاحب البلاغ إلى أن الكثير من المعايير المرتبطة إما recursing أو حلقات هي جدا لغة محددة.حتمية اللغات عادة بشكل أسرع باستخدام حلقة أبطأ مع العودية والعكس بالعكس بالنسبة اللغات الوظيفية.أعتقد أن النقطة الرئيسية أن تأخذ من هذا الرابط هو أنه من الصعب جدا الإجابة على السؤال في اللغة الملحد / الوضع أعمى معنى.

هو العودية أسرع من أي وقت مضى من حلقات?

العودية هو أكثر تكلفة في الذاكرة ، حيث أن كل دعوة متكررة عموما يتطلب عنوان الذاكرة دفع إلى المكدس - حتى في وقت لاحق برنامج يمكن العودة إلى هذه النقطة.

لا يزال هناك العديد من الحالات التي العودية هو الكثير أكثر طبيعية للقراءة من الحلقات مثل عند العمل مع الأشجار.في هذه الحالات أنصح التمسك العودية.

عادة ما يتوقع المرء أداء عقوبة الكذب في الاتجاه الآخر.دعوات متكررة يمكن أن يؤدي إلى بناء كومة إضافية للإطارات ؛ عقوبة هذا يختلف.أيضا ، في بعض لغات مثل بايثون (أكثر بشكل صحيح في بعض تطبيقات بعض اللغات...) ، يمكنك تشغيل إلى كومة حدود بدلا من ذلك بسهولة عن المهام التي قد تحدد بشكل متكرر ، مثل إيجاد القيمة القصوى في شجرة هيكل البيانات.في هذه الحالات, كنت حقا تريد أن العصا مع الحلقات.

كتابة جيدة وظائف العودية يمكن أن تقلل من الأداء العقوبة إلى حد ما ، على افتراض لديك المترجم أن يحسن ذيل recursions ، إلخ.(أيضا تأكد من أن وظيفة حقا هو الذيل العودية---انها واحدة من تلك الأشياء التي كثير من الناس يخطئون في.)

وبصرف النظر عن "حافة" الحالات (الحوسبة عالية الأداء, كبيرة جدا العودية العمق ، الخ) ، فمن الأفضل أن تعتمد نهجا أكثر وضوحا عن القصد الخاص هو مصممة تصميما جيدا ، للصيانة.وتحسين إلا بعد تحديد حاجة.

العودية هو أفضل من التكرار على المشاكل التي يمكن تقسيمها إلى متعددة, أصغر قطعة.

على سبيل المثال لجعل العودية Fibonnaci الخوارزمية ، كسر فيبوناتشي(ن) في fib(n-1) و فيبوناشي(n-2) و حساب كل أجزاء.التكرار فقط يسمح لك لتكرار وظيفة واحدة مرارا وتكرارا.

ومع ذلك ، فيبوناتشي هو في الواقع كسر على التكرار هو في الواقع أكثر كفاءة.لاحظ أن أكذوبة(ن) = fib(n-1) + fib(n-2) و فيبوناشي(n-1) = fib(n-2) + fib(n-3).fib(n-1) يحصل تحسب مرتين!

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

لذا نعم - العودية هو أفضل من التكرار على المشاكل التي يمكن تقسيمها إلى عدة أصغر مستقلة مشاكل مماثلة.

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

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

أعتقد ذيل العودية في جاوة حاليا الأمثل.التفاصيل متناثر في جميع أنحاء هذا مناقشة LtU وما يرتبط بها من الروابط.ذلك قد تكون ميزة في النسخة القادمة 7, ولكن على ما يبدو أنه يقدم بعض الصعوبات عندما جنبا إلى جنب مع كومة التفتيش منذ إطارات معينة قد تكون مفقودة.كومة التفتيش تم استخدامها لتنفيذ غرامة الحبيبات نموذج الأمن منذ جافا 2.

http://lambda-the-ultimate.org/node/1333

هناك العديد من الحالات حيث أنه يعطي أكثر من ذلك بكثير أنيقة الحل على الطريقة التكرارية المشتركة على سبيل المثال اجتياز شجرة ثنائية, لذلك ليس بالضرورة أكثر صعوبة للحفاظ على.في عام ، تكرارية الإصدارات عادة ما تكون أسرع قليلا (و خلال التحسين قد استبدال متكررة الإصدار) ، ولكن العودية الإصدارات هي أبسط فهم وتنفيذ بشكل صحيح.

العودية هي مفيدة جدا في بعض الحالات.على سبيل المثال النظر في قانون إيجاد مضروب

int factorial ( int input )
{
  int x, fact = 1;
  for ( x = input; x > 1; x--)
     fact *= x;
  return fact;
}

الآن النظر في ذلك باستخدام الدالة

int factorial ( int input )
{
  if (input == 0)
  {
     return 1;
  }
  return input * factorial(input - 1);
}

من خلال مراقبة هذين ، يمكننا أن نرى أن العودية من السهل أن نفهم.ولكن إذا لم يتم استخدامه مع الرعاية يمكن أن يكون الكثير من عرضه للخطأ أيضا.أنه إذا فاتنا if (input == 0), ثم رمز سيتم تنفيذه لبعض الوقت وينتهي عادة تجاوز سعة مكدس.

في كثير من الحالات العودية هو أسرع بسبب التخزين المؤقت ، مما يحسن من الأداء.على سبيل المثال, هنا هو تكرارية نسخة من دمج النوع باستخدام التقليدية دمج الروتينية.أنه سيتم تشغيل أبطأ من تنفيذ العودية بسبب التخزين المؤقت تحسين الأداء.

تكرارية تنفيذ

public static void sort(Comparable[] a)
{
    int N = a.length;
    aux = new Comparable[N];
    for (int sz = 1; sz < N; sz = sz+sz)
        for (int lo = 0; lo < N-sz; lo += sz+sz)
            merge(a, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1));
}

تنفيذ العودية

private static void sort(Comparable[] a, Comparable[] aux, int lo, int hi)
{
    if (hi <= lo) return;
    int mid = lo + (hi - lo) / 2;
    sort(a, aux, lo, mid);
    sort(a, aux, mid+1, hi);
    merge(a, aux, lo, mid, hi);
}

ملاحظة: - هذا ما قيل من قبل البروفيسور كيفن واين (جامعة برينستون) على الحال على الخوارزميات التي عرضت على موقع "كورسيرا".

استخدام العودية أنت تكبد تكلفة استدعاء دالة مع كل "التكرار" ، بينما مع حلقة, الشيء الوحيد الذي عادة ما تدفع زيادة/إنقاص.لذلك ، إذا كان رمز حلقة لا أكثر تعقيدا من رمز حل العودية, حلقة عادة ما تكون متفوقة على الإعادة.

الإعادة و التكرار يعتمد على منطق الأعمال التي تريد أن تنفذ ، على الرغم من أن في معظم الحالات يمكن أن تستخدم بالتبادل.معظم المطورين الذهاب العودية لأنه أسهل للفهم.

ذلك يعتمد على اللغة.في جافا يجب عليك استخدام الحلقات.اللغات الوظيفية تحسين العودية.

إذا كنت فقط بالتكرار أكثر من قائمة ، ثم بالتأكيد تكرار بعيدا.

بضع إجابات أخرى ذكر (العمق أولا) اجتياز شجرة.إنه فعلا مثال عظيم, لأنه شيء شائع جدا القيام به شائع جدا بنية البيانات.العودية هو بديهية للغاية لهذه المشكلة.

تحقق من "نجد" أساليب هنا:http://penguin.ewu.edu/cscd300/Topic/BSTintro/index.html

العودية هو أكثر بسيطة (وبالتالي أكثر الأساسية) من أي ممكن تعريف التكرار.يمكنك تحديد تورينج-استكمال النظام فقط مع زوج من combinators (نعم, حتى العودية نفسه هو مشتق فكرة في هذا النظام). امدا حساب التفاضل والتكامل هو على نفس القدر من القوة الأساسية في النظام ، ويضم وظائف العودية.ولكن إذا كنت ترغب في تحديد التكرار بشكل صحيح, كنت بحاجة الى مزيد من الأوليات أن تبدأ مع.

أما بالنسبة رمز - لا ، العودية رمز هو في الواقع أسهل بكثير لفهم للحفاظ على من بحتة تكرارية واحدة ، حيث أن معظم هياكل البيانات دوريا.بالطبع ، من أجل الحق في الحصول عليها تحتاج إلى لغة مع دعم عالية الوظائف و الإغلاق على الأقل - للحصول على كل مستوى combinators و التكرار في طريقة أنيقة.في C++, بالطبع, معقدة متكررة حلول يمكن أن ننظر قليلا القبيح ، إلا إذا كنت من المتشددين المستخدم من FC++ و على حد سواء.

أعتقد في (غير الذيل) العودية سيكون هناك ضرب أداء تخصيص جديد كومة الخ في كل مرة يتم استدعاء الدالة (التي تعتمد على اللغة بالطبع).

ذلك يعتمد على "العودية العمق".ذلك يعتمد على كم استدعاء دالة النفقات العامة من شأنها التأثير على إجمالي وقت التنفيذ.

على سبيل المثال ، حساب الكلاسيكية مضروب في العودية طريقة فعالة جدا بسبب:- مخاطر البيانات تفيض - خطر كومة تفيض - استدعاء دالة النفقات العامة تحتل 80% من وقت التنفيذ

في حين النامية مين ماكس خوارزمية تحليل الموقف في لعبة الشطرنج التي سيتم تحليل اللاحقة ن التحركات يمكن تنفيذها في العودية على "تحليل العمق" (كما أفعل ^_^)

العودية?من أين أبدأ, ويكي سوف اقول لكم "انها عملية تكرار العناصر في الذات بطريقة مماثلة"

مرة أخرى في الأيام عندما كنت تفعل C, C++ العودية كان الله يرسل أشياء مثل "ذيل العودية".ستجد أيضا العديد من خوارزميات الفرز استخدام العودية.نوع سريع على سبيل المثال: http://alienryderflex.com/quicksort/

العودية هو مثل أي خوارزمية أخرى مفيدة لمشكلة معينة.ربما قد لا تجد استخدامها على الفور أو في كثير من الأحيان ولكن لن يكون هناك مشكلة عليك أن تكون سعيدا لأنها متاحة.

في C++ إذا كانت وظيفة العودية هو قالب واحد ، ثم المترجم له أكثر من فرصة لتحسين ذلك لأن كل نوع خصم وظيفة التجسيدات سوف تحدث في وقت الترجمة.الحديث المجمعين يمكن أيضا مضمنة وظيفة إذا كان ذلك ممكنا.حتى إذا كان أحد يستخدم الأمثل الأعلام مثل -O3 أو -O2 في g++, ثم recursions قد يكون فرصة أن تكون أسرع من التكرار.في تكرارية رموز مترجم يحصل على أقل فرصة لتحسين ذلك كما سبق في أكثر أو أقل الأمثل الدولة (إذا كانت مكتوبة بشكل جيد بما فيه الكفاية).

في حالتي, كنت أحاول تنفيذ مصفوفة الأسي التوفيق باستخدام المدرع مصفوفة الكائنات في كل متكررة ومتكررة الطريق.الخوارزمية يمكن العثور عليها هنا... https://en.wikipedia.org/wiki/Exponentiation_by_squaring.بلدي وظائف قالب و لدي حساب 1,000,000 12x12 المصفوفات رفع إلى السلطة 10.حصلت على النتيجة التالية:

iterative + optimisation flag -O3 -> 2.79.. sec
recursive + optimisation flag -O3 -> 1.32.. sec

iterative + No-optimisation flag  -> 2.83.. sec
recursive + No-optimisation flag  -> 4.15.. sec

هذه النتائج تم الحصول عليها باستخدام دول مجلس التعاون الخليجي-4.8 مع c++11 العلم (-std=c++11) و المدرع 6.1 مع إنتل mkl.إنتل مترجم يدل أيضا على نتائج مشابهة.

مايك هو الصحيح.الذيل هو العودية لا الأمثل من قبل المحول البرمجي Java أو JVM.سوف تحصل دائما على تجاوز سعة مكدس مع شيء من هذا القبيل:

int count(int i) {
  return i >= 100000000 ? i : count(i+1);
}

يجب أن نأخذ في الاعتبار أن استخدام عميق جدا العودية سيتم تشغيل في تجاوز سعة مكدس الذاكرة المؤقتة اعتمادا على السماح حجم مكدس.لمنع هذا تأكد من توفر بعض الحالة الأساسية التي تنتهي أنت العودية.

العودية لديه عيب أن الخوارزمية التي تكتب استخدام العودية وقد O(n) مساحة التعقيد.في حين تكرارية aproach يكون مساحة تعقيد O(1).هذا هو advantange استخدام التكرار على العودية.ثم لماذا نستخدم العودية?

انظر أدناه.

في بعض الأحيان أنه من الأسهل أن أكتب خوارزمية استخدام العودية في حين انها قليلا أكثر صرامة لكتابة نفس الخوارزمية باستخدام التكرار.في هذه الحالة إذا كنت تختار أن تتبع نهج التكرار سيكون لديك للتعامل مع كومة نفسك.

بقدر ما أعرف, Perl لا تحسين الذيل دعوات متكررة ، ولكن يمكنك وهمية.

sub f{
  my($l,$r) = @_;

  if( $l >= $r ){
    return $l;
  } else {

    # return f( $l+1, $r );

    @_ = ( $l+1, $r );
    goto &f;

  }
}

عندما أول من دعا فإنه سيتم تخصيص مساحة على المكدس.ثم فإنه سيتم تغيير الحجج و إعادة تشغيل روتين فرعي ، دون إضافة أي شيء أكثر إلى المكدس.ولذلك فإنه سوف أدعي أنه لم يسمى النفس, تغيير في عملية تكرارية.

علما أنه لا يوجد "my @_;"أو "local @_;"لو فعلت ذلك لن تعمل.

فقط باستخدام كروم 45.0.2454.85 م ، العودية يبدو أن كمية لطيفة بشكل أسرع.

هنا هو رمز:

(function recursionVsForLoop(global) {
    "use strict";

    // Perf test
    function perfTest() {}

    perfTest.prototype.do = function(ns, fn) {
        console.time(ns);
        fn();
        console.timeEnd(ns);
    };

    // Recursion method
    (function recur() {
        var count = 0;
        global.recurFn = function recurFn(fn, cycles) {
            fn();
            count = count + 1;
            if (count !== cycles) recurFn(fn, cycles);
        };
    })();

    // Looped method
    function loopFn(fn, cycles) {
        for (var i = 0; i < cycles; i++) {
            fn();
        }
    }

    // Tests
    var curTest = new perfTest(),
        testsToRun = 100;

    curTest.do('recursion', function() {
        recurFn(function() {
            console.log('a recur run.');
        }, testsToRun);
    });

    curTest.do('loop', function() {
        loopFn(function() {
            console.log('a loop run.');
        }, testsToRun);
    });

})(window);

النتائج

// 100 يعمل باستخدام معيار حلقة

100x حلقة تشغيل.الوقت لإكمال: 7.683 ms

// 100 يعمل باستخدام وظيفية العودية نهج w/ ذيل العودية

100x العودية تشغيل.الوقت لإكمال: 4.841 ms

في الصورة أدناه ، العودية يفوز مرة أخرى من قبل أكبر الهامش عند تشغيل بسرعة 300 دورة في اختبار

Recursion wins again!

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

على سبيل المثال ، في بعض اللغات ، هناك العودية مؤشرات دمج النوع من التطبيقات.

ولكن مرة أخرى, خاصية تعدد يمكن استخدامها مع حلقات بدلا من العودية ، فكيف حسن هذا الجمع بين العمل يعتمد على أكثر من العوامل بما في ذلك نظام التشغيل موضوع آلية تخصيص.

أنا سوف أجيب على سؤالك من خلال تصميم هاسكل بنية البيانات من خلال "تحريض", الذي هو نوع من "المزدوج" إلى العودية.ثم سوف تظهر كيف هذه الازدواجية يؤدي إلى أشياء لطيفة.

ونحن نقدم نوع شجرة بسيطة:

data Tree a = Branch (Tree a) (Tree a)
            | Leaf a
            deriving (Eq)

يمكننا قراءة هذا التعريف قوله "شجرة فرع (الذي يحتوي على اثنين من الأشجار) أو ورقة (الذي يحتوي على البيانات القيمة)".حتى ورقة هو نوع من الحد الأدنى القضية.إذا شجرة ليست ورقة, ثم يجب أن يكون مركب شجرة تحتوي على اثنين من الأشجار.هذه هي فقط الحالات.

دعونا جعل شجرة:

example :: Tree Int
example = Branch (Leaf 1) 
                 (Branch (Leaf 2) 
                         (Leaf 3))

الآن لنفترض أننا نريد إضافة 1 إلى كل قيمة في الشجرة.يمكننا القيام بذلك عن طريق الدعوة:

addOne :: Tree Int -> Tree Int
addOne (Branch a b) = Branch (addOne a) (addOne b)
addOne (Leaf a)     = Leaf (a + 1)

أولا لاحظ أن هذا هو في الواقع تعريف العودية.فإنه يأخذ البيانات منشئات فرع ورقة حالات (وبما أن ورقة هو الحد الأدنى و هذه هي فقط الحالات الممكنة) ، ونحن على يقين من أن وظيفة سيتم إنهاء.

ما من شأنه أن نكتب addOne في تكرارية النمط ؟ ماذا حلقات في عدد التعسفي من فروع تبدو وكأنها ؟

أيضا هذا النوع من العودية كثير من الأحيان يمكن أن يؤخذ بها ، حيث "functor".ونحن يمكن أن تجعل الأشجار في Functors من خلال تحديد:

instance Functor Tree where fmap f (Leaf a)     = Leaf (f a)
                            fmap f (Branch a b) = Branch (fmap f a) (fmap f b)

و تعريف:

addOne' = fmap (+1)

يمكننا أن العوامل الأخرى العودية مخططات مثل catamorphism (أو أضعاف) عن جبري نوع البيانات.باستخدام catamorphism ، يمكن أن نكتب:

addOne'' = cata go where
           go (Leaf a) = Leaf (a + 1)
           go (Branch a b) = Branch a b

تجاوز سعة المكدس لن تحدث إلا إذا كنت البرمجة بلغة لا يكون في بني إدارة الذاكرة....خلاف ذلك ، تأكد من أن لديك شيء في وظيفة الخاص بك (أو استدعاء دالة ، STDLbs ، إلخ).دون العودية فإنه ببساطة لا يمكن أن يكون أشياء مثل...جوجل أو SQL أو أي مكان واحد يجب أن بكفاءة من خلال فرز كبيرة هياكل البيانات (الطبقات) أو قواعد البيانات.

العودية هو الطريق للذهاب إذا كنت ترغب في تكرار خلال ملفات متأكد من ذلك كيف تجد * | ?grep *' يعمل.كيندا المزدوج العودية ، خصوصا مع الأنابيب (ولكن لا تفعل حفنة من syscalls مثل العديد من ترغب في القيام به إذا كان هناك أي شيء كنت تنوي وضع هناك قبل الآخرين).

أعلى مستوى اللغات حتى رنة/cpp تنفيذه نفسه في الخلفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top