Có giải pháp nào cho các lỗi Stack Overflow trong các hàm đệ quy trong Ruby không?Có cách giải quyết nào cho các lỗi "mức xếp chồng quá sâu" trong các thói quen đệ quy không?
Say, ví dụ, tôi có khối này:
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end
nếu tôi gọi countUpTo(1, 10000)
, tôi nhận được một lỗi: stack level too deep (SystemStackError)
.
Nó dường như vỡ ở 8187. Có một số chức năng mà tôi có thể gọi cho Ruby để bỏ qua kích thước của ngăn xếp, hoặc một cách để tăng kích thước ngăn xếp tối đa?
Đừng làm điều này. Nếu bạn cố ý dùng lại 10.000 lần, bạn đang làm điều đó một cách khủng khiếp và lạm dụng đệ quy. – meagar
Việc triển khai Ruby không nhất thiết phải thực hiện xóa cuộc gọi đuôi, vì vậy bạn đang dựa vào việc sử dụng kích thước ngăn xếp C. Một khả năng là bạn có thể viết lại hàm của mình để lặp lại. – birryree
Thứ nhất, kinh nghiệm của riêng tôi với Ruby là nó không đặc biệt tốt với đệ quy, trong đó nó tạo ra các lỗi như thế này khá dễ dàng và nó chậm (er hơn bạn muốn). Ngoài ra, để có được hiệu suất tốt hơn trong lĩnh vực này, bạn cần biên dịch Ruby với một tập hợp nhất định nhất định, nhưng tôi không thấy điều này giúp ích nhiều cho lắm. Nói cách khác, hãy viết hàm của bạn theo cách khác nhau bằng cách sử dụng các phương thức Ruby thông thường như 'times',' upto' etc. @meagar trừ khi bạn biết mục đích là gì, tôi không nghĩ bạn có thể khẳng định điều đó. Tôi viết các phương pháp trong Haskell mà recurse rằng số lần không có vấn đề và nó de rigeur. – iain