Tôi đang cố gắng để thực hiện một chức năng danh sách-sắp xếp đuôi-đệ quy trong OCaml, và tôi đã đi lên với đoạn mã sau:đuôi đệ quy trong OCaml
let tailrec_merge_sort l =
let split l =
let rec _split source left right =
match source with
| [] -> (left, right)
| head :: tail -> _split tail right (head :: left)
in _split l [] []
in
let merge l1 l2 =
let rec _merge l1 l2 result =
match l1, l2 with
| [], [] -> result
| [], h :: t | h :: t, [] -> _merge [] t (h :: result)
| h1 :: t1, h2 :: t2 ->
if h1 < h2 then _merge t1 l2 (h1 :: result)
else _merge l1 t2 (h2 :: result)
in List.rev (_merge l1 l2 [])
in
let rec sort = function
| [] -> []
| [a] -> [a]
| list -> let left, right = split list in merge (sort left) (sort right)
in sort l
;;
Tuy nhiên, có vẻ như nó không thực sự là đệ quy đuôi, kể từ khi tôi gặp phải một "tràn ngăn xếp trong quá trình đánh giá (lặp đệ quy?)" lỗi.
Bạn có thể vui lòng giúp tôi phát hiện cuộc gọi không đệ quy trong mã này không? Tôi đã tìm kiếm khá nhiều, không tìm thấy nó. Cout nó được cho phép ràng buộc trong các chức năng sort
?
Ồ, tôi nghĩ tôi hiểu; cảm ơn! Nhưng sau đó, làm thế nào tôi có thể làm cho hàm của tôi đệ quy? –
Bạn có thể giải thích tại sao việc tiếp tục thực sự làm cho hàm có tính đệ quy đuôi? Hay họ chỉ di chuyển quá trình chụp khung hình ngăn xếp từ ngăn xếp (có khả năng tràn) đến kết thúc được tạo ra? – Dario
Hmmm, tôi đoán điều này sẽ làm việc, nhưng tôi không thực sự hiểu những gì các chức năng k làm. Bạn có thể giải thích một chút được không? Cảm ơn rất nhiều! Tôi đã thử nghiệm nó mặc dù, nhưng nó không giải quyết được vấn đề tràn ... Bất kỳ ý tưởng tại sao? –