编写函数时的Scheme#<void>

时间:2016-11-08 21:39:26

标签: scheme racket

我正在尝试编写一个将数字插入到现有树中的函数。到目前为止我已经

(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)时。我想知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

T(n) = 2T(n/2) + O(1)的结果是T(n) = O(n)的返回值,而球拍的sub-insert则不返回任何内容,或set!

在递归过程中不要修改set! 相反,首先构建结果,然后更新#<void>

tree

其余代码可以保持不变。

我可以建议您使用更小更简单的测试用例开始测试 您可能会发现单节点树存在同样的问题,这更容易推理和调试 (请注意,您的测试树不是一个有效的搜索树,因此它不是一个非常好的测试用例。)