2016-05-14 17 views
25

Tôi đã cố gắng hiểu Tail call optimization trong ngữ cảnh JavaScript và đã viết các phương pháp đệ quy và đệ quy dưới đây cho factorial().Các chức năng trong JavaScript đuôi có được tối ưu hóa không?

đệ quy:

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

đuôi đệ quy:

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

    return fact(n, 1) 
} 

Nhưng tôi không chắc chắn nếu phiên bản tail-recursive của hàm sẽ được tối ưu hóa bởi trình biên dịch Javascript như nó được thực hiện bằng các ngôn ngữ khác như Scala, vv .. Ai đó có thể giúp tôi với cái này?

+0

Dòng 2 trong đoạn đuôi đệ quy cần phải được 'chức năng thực tế (n, acc) 'để làm việc. Cảm ơn đoạn trích, tôi đã cố gắng tìm hiểu điều này ngay hôm nay! –

Trả lời

17

Có, ES2015 cung cấp tối ưu hóa cuộc gọi đuôi ở chế độ nghiêm ngặt. Tiến sĩ Axel Rauschmayer đưa nó ra đẹp mắt ở liên kết dưới đây, vì vậy tôi sẽ không lặp lại lời nói của ông ở đây.

Lưu ý: ES 5 không tối ưu hóa các cuộc gọi đuôi.

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

+0

Nhưng nó có được tối ưu hóa trong ES5 không? –

+1

Không, chỉ trong ES2015 + – sheeldotme

+0

Thông báo quan trọng: nó chỉ có thể được tối ưu hóa ở chế độ nghiêm ngặt. – Barmar

11

Về lý thuyết có. Như các tiểu bang trả lời khác.

Thực tế, kể từ tháng 7 năm 2017, Không. Chỉ Safari hỗ trợ.

Javascript ES6 (ES2015) tương thích: https://kangax.github.io/compat-table/es6/

+2

Đúng - và vì Chrome không hoạt động, có vẻ như khả năng tuyệt vời mà các cuộc gọi đuôi sẽ không bao giờ có thể sử dụng được trong mã sản xuất. https://www.chromestatus.com/feature/5516876633341952 –

Các vấn đề liên quan