根据Racket参考手册中的结构/直流入口中的以下示例,下面的bst/c函数返回一个契约,例如bt中的每个节点在lo和hi之间都有其值绑定。
(struct bt (val left right))
(define (bst/c lo hi)
(or/c #f
(struct/dc bt
[val (between/c lo hi)]
[left (val) #:lazy (bst lo val)]
[right (val) #:lazy (bst val hi)])))这个定义在我看来是完美的,除了一件事:这里的(or/c #f [...])构造的目的是什么?既然#f是一个常量,它总是计算为false,那么为什么不干脆删除or/c逻辑,只将bst/c定义为:
(define (bst/c lo hi)
(struct/dc bt
[val (between/c lo hi)]
[left (val) #:lazy (bst lo val)]
[right (val) #:lazy (bst val hi)]))发布于 2014-12-09 22:47:28
具有单个值的二进制搜索树构造为:
(bst 42 #f #f)这里#f用来表示左、右子树是空的。
因为我们希望左右子树也是二进制搜索树,所以我们需要包含值#f作为合法的bst。合同(或/c #f .)只是这么说的。
https://stackoverflow.com/questions/27389777
复制相似问题