List.fold_right
không tail-recursive
là như được chỉ ra ở đây http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.htmlTại sao OCaml List.fold_right không được triển khai như đệ quy đuôi?
Câu hỏi của tôi là tại sao List.fold_right
đã không thực hiện như tail-recursive
?
Tôi nghĩ rằng nó không phải là khó để làm như vậy
let rev l =
let rec revr acc = function
| [] -> acc
| hd::tl -> revr (hd::acc) tl
in
revr [] l;;
let fold_right f l b =
let rev_l = rev l
in
let rec folder_rr acc = function
| [] -> acc
| hd::tl -> folder_rr (f hd acc) tl
in
folder_rr b rev_l;;
Tôi cũng tìm thấy trong thư viện, một số chức năng không phải là tail-recursive
trong khi họ có thể được thực hiện như tail-recursive
. Nhà sản xuất đưa ra quyết định như thế nào?
Bạn có bất kỳ bằng chứng nào cho thấy các phiên bản đệ quy đuôi chậm hơn không? Tôi không bị thuyết phục ... :-) –
Cách dễ dàng để làm cho «fold_right' đuôi đệ quy, như được thực hiện bởi bài đăng gốc ở trên, là đảo ngược danh sách đầu tiên, sau đó sử dụng fold_left. Điều này có chi phí dễ dàng đo lường trên điểm chuẩn. Các kỹ thuật phức tạp hơn có sẵn, chẳng hạn như sử dụng bộ đếm cùng với thông thường traversal, và chỉ 'rev'-ing phần còn lại của danh sách cho gấp trái khi truy cập vượt qua một tresholf; điều này cho phép có chi phí rất nhỏ cho các danh sách nhỏ. Chúng tôi đã thực hiện điều này [trong pin] (https://github.com/ocaml-batteries-team/batteries-included/blob/master/src/batList.ml#L380) và hiệu suất là okay. – gasche