2016-05-14 21 views
25

Ho cercato di capire Tail call optimization nel contesto di JavaScript e ho scritto i seguenti metodi ricorsivi e coda-ricorsivi per factorial().Le funzioni in coda JavaScript sono ottimizzate?

ricorsivo:

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

Coda-recursive:

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

    return fact(n, 1) 
} 

Ma io non sono sicuro se la versione tail-recursive della funzione sarà ottimizzato da compilatore JavaScript come è fatto in altre lingue come Scala ecc. Qualcuno può darmi una mano su questo?

+0

linea 2 nel frammento di coda-ricorsiva deve essere 'funzione di fatto (n, acc)' al fine di lavorare. Grazie per il frammento, stavo cercando di capirlo oggi! –

risposta

17

Sì, ES2015 offre l'ottimizzazione chiamata coda in modalità rigorosa. Il Dr. Axel Rauschmayer lo espone magnificamente al link sottostante, quindi non dovrò ripetere le sue parole qui.

Nota: ES 5 non ottimizza le chiamate di coda.

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

+0

Ma è ottimizzato in ES5? –

+1

No, solo in ES2015 + – sheeldotme

+0

Avvertenza importante: può essere ottimizzata solo in modalità rigorosa. – Barmar

11

In teoria sì. Come afferma l'altra risposta.

In pratica però, a partire da luglio 2017, No. Solo Safari lo supporta.

Javascript ES6 (ES2015) compatibilità: https://kangax.github.io/compat-table/es6/

+2

Corretto - e poiché Chrome non funziona affatto, sembra che ci sia un'eccellente probabilità che le chiamate tail non saranno mai utilizzabili nel codice di produzione. https://www.chromestatus.com/feature/5516876633341952 –

Problemi correlati