Tree 多态二叉树函数

Tree 多态二叉树函数,tree,scheme,racket,Tree,Scheme,Racket,我在做两个硬件问题时遇到困难。其中一个需要编写一个多态二叉树函数,用于具有契约的插入和搜索 insert : a (treeof a) (a a -> bool) -> (treeof a) 及 合同是 ;; A bst is either empty or (make-bst n l r) where ;; n is an alpha, r and l are bst. (define-struct bst (n l r)) 我真的不太明白合同中的a->bool部分,这让我

我在做两个硬件问题时遇到困难。其中一个需要编写一个多态二叉树函数,用于具有契约的插入和搜索

insert : a (treeof a) (a a -> bool) -> (treeof a) 

合同是

;; A bst is either empty or (make-bst n l r) where
;;  n is an alpha, r and l are bst.
(define-struct bst (n l r))
我真的不太明白合同中的
a->bool
部分,这让我很困惑,因为我真的不知道是应该在那里进行测试,还是应该进行其他测试。如何处理这些函数以适应第三个变量

我的第二个问题有以下合同:

;; A bspt is either
;; - (make-rect c) (the rect represents the leaves of the tree)
;; - (make-bspt s l r) (this is a node with two children
;; Where s is either 'x or 'y, l and r are children
;; and c is a color
(define-struct bspt (s l r))
(define-struct rect (c))
并键入以下内容:

(define t1 (make-bspt 'x (make-rect 'red) (make-rect 'blue)))
(show-tree t1)
(define t1 (make-bspt 'x (make-rect 'red) (make-rect 'blue)))
(show-tree t1)
给你一个正方形,它被分成两部分,红色是左边,蓝色是右边

(define t2 (make-bspt 'x (make-bspt 'x (make-rect 'green) (make-rect 'red)) (make-rect 'blue)))
(show-tree t2)
(define t2 (make-bspt 'x (make-bspt 'x (make-rect 'green) (make-rect 'red)) (make-rect 'blue)))
(show-tree t2)
再次拆分左侧,首先是绿色矩形,然后是原始红色,然后蓝色侧保持不变

最后

(define t3 (make-bspt 'x (make-bspt 'x (make-bspt 'y (make-rect 'yellow) (make-rect 'orange)) (make-rect 'red)) (make-rect 'blue)))
(show-tree t3)
将绿色部分一分为二,绿色部分的顶部为橙色,底部为黄色,其他部分保持不变。我很难想象一个函数,如果你输入上面给定的函数,它会给你相应的图形。任何有用的提示/代码都将非常有用,敬请谅解

搜寻 你真的一次问了很多问题,所以我将用一个简单的问题开始,即
搜索
函数

我将这样编写它(使用
null
而不是
empty
,它们是等效的):

因此,
e
是任何类型的元素,
atree
是树,
equalp
是可用于
e
类型的相等谓词

对于符号,
equalp
将是
eq?

(define t1 (make-bst 'blue (make-bst 'red null null) (make-bst 'green null null)))
(bst-search 'blue t1 eq?)
=> #t
(bst-search 'red t1 eq?)
=> #t
(bst-search 'yellow t1 eq?)
=> #f
对于字符串,其
字符串=?

(define t2 (make-bst "blue" (make-bst "red" null null) (make-bst "green" null null)))
(bst-search "blue" t2 string=?)
=> #t
(bst-search "red" t2 string=?)
=> #t
(bst-search "yellow" t2 string=?)
=> #f
展示树 我对Racket绘图库不是很熟悉,但一个简单的显示树如下所示:

(require 2htdp/image)

(define (show-tree tree)
  (cond
    ((bspt? tree) 
     ((if (eq? 'x (bspt-s tree)) beside above) (show-tree (bspt-l tree)) 
                                               (show-tree (bspt-r tree))))
    ((rect? tree) 
     (square 20 'solid (rect-c tree)))))
然后

它们可能没有按应有的方式对齐或调整大小,但通过基于树高进行一些计算,您可以做得更好:

(define (tree-space tree)
  (if (bspt? tree)
      (let ((x (bspt-s tree)))
        (define-values (lx ly) (tree-space (bspt-l tree)))
        (define-values (rx ry) (tree-space (bspt-r tree)))
        (if (eq? x 'x)
            (values (* 2 (max lx rx))      (max ly ry))
            (values      (max lx rx)  (* 2 (max ly ry)))))
      (values 20 20)))

(define (show-tree tree)
  (define (sub tree x y)
    (cond
      ((bspt? tree) 
       (define s (bspt-s tree))
       (define d (if (eq? 'x s) beside above))
       (apply (lambda (x y) (d (sub (bspt-l tree) x y) (sub (bspt-r tree) x y)))
              (if (eq? s 'x) (list (/ x 2) y) (list x (/ y 2)))))
      ((rect? tree) 
       (rectangle x y 'solid (rect-c tree)))))
  (define-values (totx toty) (tree-space tree))
  (sub tree totx toty))
屈服


“a->bool”是任何接受两个相同类型的值并返回布尔值的函数。示例(定义(my less int1 int2)(bool就是你所说的“测试”。@ben它是一个二进制谓词,其中
是两个。顺便说一句,它的目的是直接传递这些信息,而不是像
my less
@chris这样的包装函数。我回答问题中的“我不太理解a->bool部分”。我觉得这是帮助和努力解决这个家庭作业问题之间的正确平衡。HtDP方法非常优秀,但是关于高阶函数的思想仍然没有被三位一体地掌握,尽管HtDP符号比显式或hindley milner静态类型更为宽容。对于我的第一个问题,将(定义(搜索xyzo)(匹配y[empty#f][(struct bst(nlr))(cond[(o(zx)(zn))(使bst x(插入x y z o)r)][(不是(或(o(z x)(z n))(=(z x)(z n)))(使bst x l(插入x r z o))[(等式?(z x)(z n))#t][其他#f]))工作?我似乎真的不能得到一张支票,除非是因为某种奇怪的原因工作。@user3819900你现在明白a->bool的意思了吗?
(define t2 (make-bspt 'x (make-bspt 'x (make-rect 'green) (make-rect 'red)) (make-rect 'blue)))
(show-tree t2)
(define t3 (make-bspt 'x (make-bspt 'x (make-bspt 'y (make-rect 'yellow) (make-rect 'orange)) (make-rect 'red)) (make-rect 'blue)))
(show-tree t3)
(define (tree-space tree)
  (if (bspt? tree)
      (let ((x (bspt-s tree)))
        (define-values (lx ly) (tree-space (bspt-l tree)))
        (define-values (rx ry) (tree-space (bspt-r tree)))
        (if (eq? x 'x)
            (values (* 2 (max lx rx))      (max ly ry))
            (values      (max lx rx)  (* 2 (max ly ry)))))
      (values 20 20)))

(define (show-tree tree)
  (define (sub tree x y)
    (cond
      ((bspt? tree) 
       (define s (bspt-s tree))
       (define d (if (eq? 'x s) beside above))
       (apply (lambda (x y) (d (sub (bspt-l tree) x y) (sub (bspt-r tree) x y)))
              (if (eq? s 'x) (list (/ x 2) y) (list x (/ y 2)))))
      ((rect? tree) 
       (rectangle x y 'solid (rect-c tree)))))
  (define-values (totx toty) (tree-space tree))
  (sub tree totx toty))