2016-11-08 42 views
0

當我試圖寫將插入一個數字到現有的樹中的功能。到目前爲止,我有方案#<void>寫一個函數

(define (make-tree v left right) 
    (list v left right)) 

(define (value t) 
    (car t)) 

(define(left t) 
    (cadr t)) 

(define(right t) 
    (caddr t)) 

(define new-tree (make-tree 10 
          (make-tree 6 
             (make-tree 3 null null) 
             (make-tree 7 null null)) 
          (make-tree 11 
             (make-tree 3 null null) 
             (make-tree 12 null null)))) 



(define(my-tree initial-tree) 
    (let ((tree initial-tree)) 
    (define (element? f) 
     (define(sub-element? f t) 
     (begin 
      (cond 
      ((null? t) #f) 
      ((eq? f (value t)) #t) 
      ((> f (value t)) (sub-element? f (right t))) 
      ((< f (value t)) (sub-element? f (left t)))))) 
     (sub-element? f tree)) 
    (define (insert f) 
     (define (sub-insert f t) 
     (begin 
     (set! tree 
       (cond 
       ((null? t) (make-tree f null null)) 
       ((eq? f (value t)) t) 
       ((< f (value t)) (make-tree (value t) (sub-insert f (left t)) (right t))) 
       ((> f (value t)) (make-tree (value t) (left t) (sub-insert f (right t)))))))) 
     (sub-insert f tree) 
     tree) 
    (lambda (method) 
     (cond 
     ((eq? method 'insert) insert) 
     ((eq? method 'element?) element?))))) 

得到的輸出(10 #<void> (11 (3()()) (12()()))) 當我做((test-tree 'insert)5)。我想知道爲什麼會出現這種情況。

+0

您發佈的代碼顯然不完整(至少缺少幾個圓括號)。 –

+0

這是一個更大的功能的一部分。另一部分起作用,我不想在那裏放置更多的東西,以方便閱讀。我只是想知道爲什麼這會導致#或更普遍的原因。 – nromer

+0

什麼函數返回'#'?沒有這些信息,我們如何才能找出問題所在? '#'返回值出現通過相同的情況下與任何其他的返回值:如果在尾部位置返回'#表達式(多個)'。 –

回答

1

sub-insert結果是set!的返回值,球拍的set!回報什麼,或#<void>

遞歸過程中不要修改tree
相反,先建的結果,然後更新tree

(define (insert f) 
    (define (sub-insert t) 
    (cond 
     [(null? t) (make-tree f null null)] 
     [(equal? f (value t)) t] 
     [(< f (value t)) (make-tree (value t) (sub-insert (left t)) (right t))] 
     [else   (make-tree (value t) (left t) (sub-insert (right t)))])) 

    (set! tree (sub-insert tree)) 
    tree) 

的代碼的其餘部分可以保持不變。

我可以建議你先從較小的和較簡單的測試用例你的測試。
你會發現與單節點樹相同的問題,這更容易推理和調試。
(請注意,您的測試樹不是一個有效的搜索樹,因此它不是一個很好的測試用例。)

+0

即使將'set!'完全移出'insert'將會更好,並且'insert'可能可能在多個全局樹上使用。 – Sylwester