Scala có hỗ trợ tối ưu đệ quy đuôi không?Scala có hỗ trợ tối ưu đệ quy đuôi không?
Trả lời
Scala tối ưu hóa đệ quy đuôi lúc biên dịch, như các áp phích khác đã nói. Đó là, một hàm đệ quy đuôi được chuyển thành một vòng lặp bởi trình biên dịch (một phương thức gọi được chuyển thành một bước nhảy), như có thể thấy từ dấu vết ngăn xếp khi chạy một hàm đệ quy đuôi.
Hãy thử đoạn mã sau:
def boom(n: Int): Nothing = if(n<=0) throw new Exception else boom(n-1)
boom(10)
và kiểm tra vết đống. Nó sẽ chỉ hiển thị một cuộc gọi đến chức năng bùng nổ - do đó bytecode được biên dịch không đệ quy.
Có một đề xuất nổi xung quanh implement tail calls at the JVM level - theo ý kiến của tôi sẽ là điều tuyệt vời để làm, khi đó JVM có thể thực hiện tối ưu hóa thời gian chạy, thay vì chỉ biên dịch tối ưu hóa mã - và có thể có nghĩa là đuôi linh hoạt hơn đệ quy. Về cơ bản, tailcall invoke
sẽ hoạt động chính xác như một phương thức bình thường invoke
nhưng sẽ thả ngăn xếp của người gọi khi an toàn để làm như vậy - đặc tả của JVM nói rằng các khung ngăn xếp phải được bảo toàn, vì vậy JIT phải thực hiện một số phân tích mã tĩnh tìm hiểu xem các khung ngăn xếp sẽ không bao giờ được sử dụng hay không.
Trạng thái hiện tại của nó là proto 80%. Tôi không nghĩ rằng nó sẽ được thực hiện trong thời gian cho Java 7 (invokedynamic
có một ưu tiên lớn hơn, và việc thực hiện gần như được thực hiện) nhưng Java 8 có thể thấy nó được thực hiện.
Chỉ trong các trường hợp rất đơn giản, trong đó chức năng là tự đệ quy.
Proof of tail recursion ability.
Dường như Scala 2.8 có thể cải thiện đuôi-đệ quy công nhận, mặc dù.
"Chỉ trong các trường hợp rất đơn giản mà chức năng là tự đệ quy.": Điều này có nghĩa là khi sử dụng tiếp tục, người ta có thể dễ dàng chạy ra khỏi không gian ngăn xếp? – Giorgio
@Giorgio: Có .. –
Scala 2.7.x hỗ trợ tối ưu hóa cuộc gọi đuôi để tự đệ quy (một hàm gọi chính nó) của các phương thức cuối cùng và các hàm cục bộ.
Scala 2.8 có thể đi kèm với thư viện hỗ trợ cho tấm bạt lò xo quá, đó là một kỹ thuật để tối ưu hóa các chức năng đệ quy lẫn nhau.
Rất nhiều thông tin về trạng thái đệ quy Scala có thể được tìm thấy trong Rich Dougherty's blog.
Cũng về trampolines monadic: http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/ – Vadzim
Trong Scala 2.8 bạn có thể sử dụng để đánh dấu @tailrec
phương pháp cụ thể mà bạn hy vọng các trình biên dịch sẽ tối ưu hóa:
import scala.annotation.tailrec
@tailrec def factorialAcc(acc: Int, n: Int): Int = {
if (n <= 1) acc
else factorialAcc(n * acc, n - 1)
}
Nếu một phương pháp không thể được tối ưu hóa bạn nhận được một cảnh báo.
Cần nhập chú thích bằng "import scala.annotation.tailrec" – Callum
- 1. CUDA có hỗ trợ đệ quy không?
- 2. Tối ưu hóa cuộc gọi đuôi bên cạnh đệ quy đuôi?
- 3. Có thể constexpr chức năng đánh giá làm đuôi đệ quy tối ưu hóa
- 4. Chức năng này có sử dụng đệ quy đuôi không?
- 5. Chú thích Scala để đảm bảo chức năng đệ quy đuôi được tối ưu hóa là gì?
- 6. Có bất kỳ đuôi đuôi động cơ Javascript nào được tối ưu hóa không?
- 7. Tại sao scalac không thể tối ưu hóa đệ quy đuôi trong các tình huống nhất định?
- 8. Tôi có thể xây dựng một cuộc gọi đuôi được gọi là biểu thức tối ưu đệ quy không?
- 9. đuôi đệ quy trong OCaml
- 10. Tại sao đuôi này không đệ quy?
- 11. Xóa bỏ đệ quy không theo đuôi có lập trình
- 12. khai thác ngắn mạch và đuôi đệ quy
- 13. Đệ quy đệ quy và đệ quy đệ quy trong Erlang
- 14. Loại bỏ đệ quy đuôi là gì?
- 15. java.lang.StackOverflowError trong clojure đuôi đệ quy
- 16. Clojure - đuôi sàng đệ quy của Eratosthenes
- 17. Có thể sử dụng phần tiếp tục để làm cho phần đuôi gập đệ quy không?
- 18. Tối ưu hóa danh sách đệ quy Haskell
- 19. Tối ưu hóa CTE cho các truy vấn đệ quy
- 20. Hiệu suất đệ quy danh sách Scala
- 21. Cài đặt WebView tối ưu cho hỗ trợ HTML5?
- 22. OptaPlanner có hỗ trợ tối ưu hóa và hạn chế về các biến liên tục không?
- 23. Frege có thực hiện tối ưu hóa cuộc gọi đuôi không?
- 24. MATLAB có thực hiện tối ưu hóa cuộc gọi đuôi không?
- 25. Scala: Cây chèn đuôi đệ quy với cấu trúc phức tạp
- 26. tối ưu hóa bởi trình biên dịch trong một chương trình đệ quy
- 27. Scala đuôi-đệ quy chức năng xử lý Suối quy định tại đặc điểm giữ tham chiếu đến dòng đầu
- 28. Có thể tối ưu hóa cuộc gọi đuôi và RAII cùng tồn tại?
- 29. Các phương pháp đệ quy để tạo Luồng trong Scala
- 30. Thuộc tính nào phải có ngôn ngữ để hỗ trợ đệ quy?
"Trạng thái hiện tại của nó là proto 80% ". Tôi không hiểu. Tôi nghĩ Arnold Schwaighofer đã hoàn toàn thực hiện điều này dưới sự hướng dẫn của John Rose từ những năm trước? –
@JanHarrop có lẽ đó là về đệ quy đuôi chứ không phải là cuộc gọi đuôi chung? – Cubic
@Cubic: Không, đó là cuộc gọi đuôi chung. Arnold cũng đã thực hiện chúng trong LLVM. –