[英]Binary Search Tree in Scheme, trying to use Dr. Racket to simply return true or false if value is present in BST. Error
我正在使用Dr。Racket,语言Pretty Big,我正在尝试制作一个简单的二叉搜索树“in?” 方法,如果值在二进制搜索树中,则返回。 它需要是通用的,接受任何类型的搜索树(无论它是否包含字符串,整数等),但我遇到了这个错误消息,这让我疯了。 任何帮助表示赞赏,这里是代码:
EDITED ::它现在有效,但除了数字之外没有任何东西(或者至少不能用于字符串)。新问题:
(define (bstsearch tree value)
(cond
((null? tree) #f)
((< value (car tree))
(bstsearch (cadr tree) value))
((> value (car tree))
(bstsearch (caddr tree) value))
((= value (car tree))
#t)
))
我收到的错误说:
<: expects type <real number> as 1st argument, given: "horse"; other arguments were: "horse"
使用时:
(bstsearch '("horse" ("cow" () ("dog" () ())) ("zebra" ("yak" ()()) ())) "horse")
作为输入。
关于您的新问题,<和>仅适用于数字。 一个简单的解决方案是将比较函数作为参数传递给bstsearch过程。
另外,如前所述,请正确缩进代码。
你不应该将参数包装在另一组parens中,所以请使用
(bstsearch (cadr tree) value)
代替
(bstsearch ((cadr tree) value))
一个问题是你的<和>逆转了。 假设您希望左子树更小,那么(<值(车辆树))应该再次使用(cadr树)调用。
你也应该用#t代替(#t)。
您遇到的新问题是因为您的比较器功能“=”。 如果你用“相等”改变它? 功能它应该是通用的,适用于任何类型的数据。 如果你想让它变得通用,比较者也应该改变。 您必须从用户那里获取它作为输入,因此它的通用版本应该是:
(define (bstsearch tree value comparer)
(cond
((null? tree) #f)
((equal? value (car tree)) #t)
((comparer value (car tree))
(bstsearch (cadr tree) value))
((not (comparer value (car tree)))
(bstsearch (caddr tree) value))
))
Comparer函数的格式应为(XX - > boolean),“<”,“>”,“string <?” 是在示例中构建的,但您也可以为自己的数据结构编写自己的比较器
请注意,相等条件位于2.行。 我希望这有帮助 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.