Là một newbie Scala, tôi đang đọc sách, tài liệu và cố gắng giải quyết vấn đề được tìm thấy trên http://aperiodic.net/phil/scala/s-99/. Có vẻ như mã Scala chính xác được dựa trên các giá trị bất biến (val) và trên đệ quy hơn là trên các vòng lặp và các biến để làm cho tính song song an toàn hơn và tránh sử dụng khóa.Scala người mới: đệ quy và stackoverflow lỗi
Ví dụ, một giải pháp khả thi cho P22 tập thể dục (http://aperiodic.net/phil/scala/s-99/p22.scala) là:
// Recursive.
def rangeRecursive(start: Int, end: Int): List[Int] =
if (end < start) Nil
else start :: rangeRecursive(start + 1, end)
Tất nhiên mã này là nhỏ gọn và trông thông minh nhưng, dĩ nhiên, nếu số lượng đệ quy là cao, bạn sẽ đối mặt với lỗi StackOverflow (rangeRecusrsive (1.10000) chẳng hạn như không có điều chỉnh JVM). Nếu bạn nhìn vào nguồn của xây dựng trong List.range (https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/immutable/List.scala#L1), bạn sẽ thấy rằng các vòng lặp và vars được sử dụng.
Câu hỏi của tôi là làm thế nào để quản lý các ảnh hưởng của các công cụ học tập Scala mà đang xúc tiến Vals và đệ quy khi biết rằng mã như vậy có thể phá vỡ do số lượng của đệ quy?
Trình biên dịch Scala đủ thông minh để thực hiện các cuộc gọi đệ quy đuôi được biên dịch trong [trampoolined] (http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html) đệ quy đuôi (JVM không hỗ trợ TCE), điều này sẽ không ảnh hưởng đến luồng stackoveflow. Nếu bạn muốn chắc chắn, mã của bạn là đệ quy đuôi, thêm chú thích @tailrec vào chữ ký phương thức –