2010-02-02 33 views
17

Ai đó có thể viết lại mã chương trình (plt) này vào Clojure không?Loại bỏ cuộc gọi đuôi ở Clojure?

(define (f n) 
    (printf "(f ~a)~n" n) 
    (g n)) 

(define (g n) 
    (printf "(g ~a)~n" n) 
    (h n)) 

(define (h n) 
    (printf "(h ~a)~n" n) 
    (f (+ n 1))) 

Bằng cách không thu gọn quy trình f, g và h với nhau và cho phép mã chạy vô thời hạn mà không bị lỗi?

Trả lời

30

Sử dụng một tấm bạt lò xo: ​​

(declare f) 

(defn h [n] 
    (println "(h " n ")") 
    #(f (+ n 1))) 

(defn g [n] 
    (println "(g " n ")") 
    #(h n)) 

(defn f [n] 
    (println "(f " n ")") 
    #(g n)) 

kick nó đi với:

(trampoline f 0) 

Tôi đã có mã này chạy trên pc của tôi ở chế độ nền trong khoảng 5 tiếng đồng hồ bây giờ và sử dụng bộ nhớ là bằng phẳng.

Các vấn đề liên quan