Vì một lý do nào đó, tôi đang gặp khó khăn khi nghĩ về cách tốt để viết lại hàm này để nó sử dụng không gian ngăn xếp liên tục. Hầu hết các cuộc thảo luận trực tuyến về cheat đệ quy cây bằng cách sử dụng hàm Fibonacci và khai thác các thuộc tính của vấn đề cụ thể đó. Có ai có bất kỳ ý tưởng cho "thế giới thực" này (tốt hơn thế giới thực hơn dãy Fibonacci) sử dụng đệ quy?Cách tốt để viết lại hàm không đệ quy này là gì?
Clojure là một trường hợp thú vị vì nó không có tối ưu hóa cuộc gọi đuôi, nhưng chỉ đệ quy đuôi thông qua biểu mẫu đặc biệt "recur". Nó cũng khuyến khích mạnh mẽ việc sử dụng trạng thái có thể thay đổi. Nó có nhiều cấu trúc lười biếng bao gồm tree-seq, nhưng tôi không thể xem chúng có thể giúp tôi như thế nào cho trường hợp này. Bất cứ ai cũng có thể chia sẻ một số kỹ thuật họ đã chọn từ C, Scheme, Haskell, hoặc các ngôn ngữ lập trình khác?
(defn flatten [x]
(let [type (:type x)]
(cond (or (= type :NIL) (= type :TEXT))
x
(= type :CONCAT)
(doc-concat (flatten (:doc1 x))
(flatten (:doc2 x)))
(= type :NEST)
(doc-nest (:level x)
(flatten (:doc x)))
(= type :LINE)
(doc-text " ")
(= type :UNION)
(recur (:doc1 x)))))
chỉnh sửa: Theo yêu cầu trong các ý kiến ...
Trình bày lại một cách chung chung và sử dụng Scheme - làm thế nào để tôi viết lại mô hình đệ quy sau vì vậy nó không tiêu thụ không gian ngăn xếp hoặc yêu cầu mòn đuôi tối ưu hóa cuộc gọi không tự gọi?
(define (frob x)
(cond ((foo? x)
x)
((bar? x)
(macerate (f x) (frob (g x))))
((thud? x)
(frobnicate (frob (g x))
(frob (h x))))))
tôi đã chọn tên gây phiền nhiễu để lái xe về nhà điểm mà tôi đang tìm kiếm câu trả lời mà không dựa trên tính chất đại số của x, ngâm, frobnicate, f, g, h hay. Tôi chỉ muốn viết lại đệ quy.
CẬP NHẬT:
Giàu Hickey đã vui lòng thêm một rõ ràng trampoline function để Clojure.
tôi sẽ nói "C++", nhưng đó sẽ là vô ích ;-) –
nó sẽ dễ dàng hơn để giúp đỡ nếu bạn giải thích những gì hiện các chức năng làm. cũng có thể sử dụng phương ngữ LISP phổ biến hơn, bản thân tôi thích sử dụng Đề án ở nhà, nhưng thực sự không thích giao diện của clojure – Javier
Tôi đã thêm phiên bản Đề án nhưng tôi nghi ngờ nó sẽ giúp ích nhiều cho bạn. :) –