Lisp 方案中的二叉搜索树,尝试使用Dr.Racket在BST.Error中存在值时仅返回true或false

Lisp 方案中的二叉搜索树,尝试使用Dr.Racket在BST.Error中存在值时仅返回true或false,lisp,scheme,racket,binary-search-tree,Lisp,Scheme,Racket,Binary Search Tree,我正在使用Dr.Racket,语言非常大,我正在尝试创建一个简单的二元搜索树“in?”方法,如果二元搜索树中有值或没有值,该方法将返回。它需要是通用的,接受任何类型的搜索树(无论它是否包含字符串、int等),但是我遇到了这个让我发疯的错误消息。感谢您的帮助,以下是代码: 已编辑::它现在可以工作,但除了数字之外,它不能工作(或者至少不能工作于字符串)。。新发行: (define (bstsearch tree value) (cond ((null? tree) #f) ((<

我正在使用Dr.Racket,语言非常大,我正在尝试创建一个简单的二元搜索树“in?”方法,如果二元搜索树中有值或没有值,该方法将返回。它需要是通用的,接受任何类型的搜索树(无论它是否包含字符串、int等),但是我遇到了这个让我发疯的错误消息。感谢您的帮助,以下是代码:

已编辑::它现在可以工作,但除了数字之外,它不能工作(或者至少不能工作于字符串)。。新发行:

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

作为输入。

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

(bstsearch  (cadr tree) value)
而不是

(bstsearch  ((cadr tree) value))

一个问题是你的<和>颠倒了。假设希望左子树较小,则(
另外,你应该使用#t而不是(#t)。

关于你的新发行,只对数字有效。 一个简单的解决方案是将比较函数作为参数传递给bstsearch过程


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

您新遇到的问题是因为您的比较器函数“=”。如果您使用“equal?”函数更改它,它应该是通用的,并且可以在任何类型的数据中工作。如果要使其通用,比较器也应该更改。您必须从用户处获取它作为输入,因此它的通用版本应为:

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

  ))

  • 比较器函数的格式应为(X X->boolean),“”,“,”string请尝试使用代码标记使您的
    lisp
    可读。为此,请按二进制按钮或将代码缩进四个空格。如果您需要它来处理字符串,则需要将其更改为使用stringThank you!但它没有更改任何内容:(如果需要它处理字符串,则需要将其更改为使用字符串
    (bstsearch  ((cadr tree) value))
    
    (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))
    
      ))