2015-09-24 2 views
1

Моя рекурсивная версия выглядитCPSed бинарное дерево обхода не работает, как ожидалось

(struct node (val left right) #:transparent) 

(define t3 (node 3 '() '())) 
(define t4 (node 4 '() '())) 
(define t5 (node 5 '() '())) 
(define t2 (node 2 t4 t5)) 
(define t1 (node 1 t2 t3)) 
; 
;  ----- 1 ----- 
; |    | 
; -- 2 --   3 
;|  | 
;4  5 

(define (countv tree) 
    (if (null? tree) 
     0 
     (+ (node-val tree) 
     (countv (node-left tree)) 
     (countv (node-right tree))))) 

(countv t1) 

И CPSed версии

(define (countk tree k) 
    (if (null? tree) 
     (k 0) 
     (countk (node-left tree) 
       (λ (lval) 
       (countk (node-right tree) 
         (λ (rval) 
          (+ (node-val tree) lval rval))))))) 

(countk t1 (λ (x) (node-val x))) 

Результат countv был 15, как и ожидалось, в то время как countk получил 4.

ответ

3

Вы забыли передать рекурсивный результат продолжения:

(define (countk tree k) 
    (if (null? tree) 
     (k 0) 
     (countk (node-left tree) 
       (λ (lval) 
       (countk (node-right tree) 
         (λ (rval) 
          (k (+ (node-val tree) lval rval)))))))) 
         ^
          Here 

После того, как вы помните, что вы получите ошибку времени выполнения, так как результат не является деревом.
Это не произошло в коде, потому что ваше начальное продолжение никогда не применялось ни к чему.

Вы должны назвать его, как это вместо:

(countk t1 (λ (x) x)) 
+0

Также используйте '(countk t1 (λ (х) х))' как обработка по умолчанию результата, а не '(countk t1 (λ (х) (node-val x))). Вы также можете использовать '(k 0) (k (countk (node-left ....' –

+0

@ReutSharabani Я добавил правильное начальное продолжение, но передача результата 'countk' в продолжение' k' неверна . – molbdnilo

+0

@molbdnilo благодарит за меня: – liweijian

Смежные вопросы