2016-05-14 24 views
25

JavaScript bağlamında Tail call optimization'u anlamaya çalışıyorum ve factorial() için aşağıda belirtilen özyinelemeli ve özyinelemeli yöntemleri yazdık.JavaScript kuyruğundaki işlevler optimize edildi mi?

Recursive:

function factorial (n) { 
    if (n < 2) { 
    return 1; 
    } else { 
    return n * factorial(n-1); 
    } 
} 

Kuyruk-özyinelemeli:

function factorial (n) { 
    function fact(n, acc) { 
    if (n < 2) { 
     return acc; 
    } else { 
     return fact(n-1, n * acc); 
    } 
    } 

    return fact(n, 1) 
} 

Ama yapıldığı gibi fonksiyon tail-recursive sürümü JavaScript derleyicisi tarafından optimize edilecek olup olmadığından emin değilim Scala vb. gibi diğer dillerde. Birisi bana yardım edebilir mi?

+0

Hat 2 Kuyruk-özyinelemeli snippet'te 'işlev aslında olması gerekir (n, acc)' sırayla çalışmak. Snippet için teşekkürler, bugün bunu anlamaya çalışıyordum! –

cevap

17

Evet, ES2015 sıkı modda kuyruk araması optimizasyonu sunuyor. Axel Rauschmayer, aşağıdaki linkte güzelce ortaya koydu, bu yüzden burada sözlerini tekrarlamayacağım.

Not: ES 5 kuyruk aramalarını iyileştirmez. Teoride

http://www.2ality.com/2015/06/tail-call-optimization.html

+0

Ancak ES5'te optimize edilmiş mi? –

+1

Hayır, yalnızca ES2015 + – sheeldotme

+0

Önemli Uyarı: Sadece sıkı modda en iyi duruma getirilebilir. – Barmar

11

evet. Diğer cevapta olduğu gibi.

Pratikte, Temmuz 2017 itibariyle, Hayır. Sadece Safari bunu desteklemektedir.

JavaScript ES6 (ES2015) uyumluluk: https://kangax.github.io/compat-table/es6/

+2

Doğru - ve Chrome hiç çalışmadığından, kuyruk kodlarının asla üretim kodunda kullanılamayacağı mükemmel bir olasılık gibi görünüyor. https://www.chromestatus.com/feature/5516876633341952 –

İlgili konular