2

我正在使用 Racket 博士,语言相当大,并且我正在尝试“在?”中创建一个简单的二叉搜索树。方法,如果一个值是否在二叉搜索树中,它将返回。它必须是通用的,接受任何类型的搜索树(无论它是否包含字符串、整数等),但我遇到了这个让我发疯的错误消息。任何帮助表示赞赏,这里是代码:

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")

作为输入。

4

4 回答 4

3

关于您的新问题, < 和 > 仅适用于数字。一个简单的解决方案是将比较函数作为参数传递给您的 bstsearch 过程。

另外,如前所述,请正确缩进代码。

于 2010-12-05T05:23:44.097 回答
2

您不应该将参数包装在另一组括号中,因此请使用

(bstsearch  (cadr tree) value)

代替

(bstsearch  ((cadr tree) value))
于 2010-12-05T04:00:30.243 回答
2

一个问题是您的 < 和 > 颠倒了。假设你希望你的左子树更小,那么 (< value (car tree)) 应该再次调用 (cadr tree)。

此外,您应该使用#t 而不是 (#t)。

于 2010-12-05T04:25:48.250 回答
1

您新面临的问题是由于您的比较器功能“=”。如果你用“等于”来改变它?功能它应该是通用的并且适用于任何类型的数据。如果你想让它通用,比较器也应该改变。您必须从用户那里获取它作为输入,因此它的通用版本应该是:

(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))

  ))
  • 比较函数的格式应为 (XX -> boolean), "<", ">", "string<?" 内置在示例中,但您也可以为自己的数据结构编写自己的比较器

  • 请注意,相等条件在 2. 行。我希望这有帮助 :)

于 2011-04-06T09:05:13.657 回答