2016-05-14 12 views
25

私はJavaScriptの文脈でTail call optimizationを理解しようとしており、factorial()の以下の再帰的および末尾再帰的なメソッドを書いています。JavaScriptテールコールの関数は最適化されていますか?

再帰:

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

末尾再帰:

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

    return fact(n, 1) 
} 

しかし、私はそれが行われるように機能のtail-recursiveバージョンではJavaScriptコンパイラによって最適化されるかどうかわかりませんScalaのような他の言語でも使えます。

+0

2行目末尾再帰スニペットで、 '動作するための関数事実(nは、ACC)'する必要があります。 スニペットをありがとう、私は今日これを理解しようとしていました! –

答えて

17

はい、ES2015は厳密なモードでテールコールの最適化を提供します。 Axel Rauschmayer博士は、下のリンクにきれいに記載していますので、私はここでその言葉を繰り返さないでください。

注:ES 5はテールコールを最適化しません。

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

+0

しかし、それはES5で最適化されていますか? –

+1

いいえ、ES2015 + – sheeldotme

+0

注意:厳密なモードでのみ最適化することができます。 – Barmar

11

理論的にはyesです。他の答えとして。

実際には、2017年7月現在、いいえ、Safariだけがサポートしています。

JavascriptをES6(ES2015)互換性: https://kangax.github.io/compat-table/es6/

+2

正解 - Chromeはまったく動作していないため、生産コードでテールコールを使用できない可能性が高いようです。 https://www.chromestatus.com/feature/5516876633341952 –

関連する問題