2016-05-14 16 views
25

Próbowałem zrozumieć Tail call optimization w kontekście JavaScript i napisałem poniżej rekurencyjne i rekursywne metody ogonowania dla factorial().Czy funkcje JavaScript tail-call są zoptymalizowane?

rekurencyjne:

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

Tail-rekurencyjne:

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

    return fact(n, 1) 
} 

Ale nie jestem pewien, czy wersja funkcji tail-recursive zostanie zoptymalizowany przez kompilator JavaScript jak to się robi w innych językach, takich jak Scala itp. Czy ktoś może mi pomóc w tej sprawie?

+0

Linia 2 we fragmencie ogon rekurencyjna musi być 'Fakt funkcja (n, acc)' w celu podjęcia pracy. Dzięki za urywek, próbowałem to rozgryźć dzisiaj! –

Odpowiedz

17

Tak, ES2015 oferuje optymalizację połączeń w trybie ścisłym. Dr Axel Rauschmayer pięknie opisuje to pod linkiem poniżej, więc nie będę tu powtarzać jego słów.

Uwaga: ES 5 nie optymalizuje połączeń typu "ogon".

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

+0

Ale czy jest zoptymalizowany w ES5? –

+1

Nie, tylko w ES2015 + – sheeldotme

+0

Ważne zastrzeżenie: może być zoptymalizowane tylko w trybie ścisłym. – Barmar

11

Teoretycznie tak. Jak podaje inna odpowiedź.

W praktyce jednak, od lipca 2017 r., Tylko w Safari jest obsługiwana.

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

+2

Poprawnie - a ponieważ Chrome w ogóle go nie obsługuje, wydaje się, że istnieje duże prawdopodobieństwo, że wywołania ogona nigdy nie będą użyteczne w kodzie produkcyjnym. https://www.chromestatus.com/feature/5516876633341952 –

Powiązane problemy