2010-04-22 42 views

回答

1

您只需編寫一個帶有堆棧的循環來記錄要處理的下一棵樹。你還需要一個累加器。但是這與CPS並沒有什麼不同,所以它可能不是你想要的。

(define (atom? x) 
    (not (pair? x))) 
(define (size tree) 
    (let loop ((t tree) (stack '()) (total 0)) 
    (cond 
     ((and (atom? t) (null? stack)) (add1 total)) 
     ((atom? t) (loop (car stack) (cdr stack) (add1 total))) 
     (else (loop (cadr t) (append (cddr t) stack) (add1 total)))))) 
(define (flatten tree) 
    (let loop ((t tree) (stack '()) (l '())) 
    (cond 
     ((and (atom? t) (null? stack)) (reverse (cons t l))) 
     ((atom? t) (loop (car stack) (cdr stack) (cons t l))) 
     (else (loop (cadr t) (append (cddr t) stack) (cons (car t) l)))))) 
+0

這正是我所期待的。 – Rhangaun 2010-04-22 15:40:57