Lisp 方案中的二叉搜索树,尝试使用Dr.Racket在BST.Error中存在值时仅返回true或false
我正在使用Dr.Racket,语言非常大,我正在尝试创建一个简单的二元搜索树“in?”方法,如果二元搜索树中有值或没有值,该方法将返回。它需要是通用的,接受任何类型的搜索树(无论它是否包含字符串、int等),但是我遇到了这个让我发疯的错误消息。感谢您的帮助,以下是代码: 已编辑::它现在可以工作,但除了数字之外,它不能工作(或者至少不能工作于字符串)。。新发行: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) ((<
(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请尝试使用代码标记使您的
可读。为此,请按二进制按钮或将代码缩进四个空格。如果您需要它来处理字符串,则需要将其更改为使用stringThank you!但它没有更改任何内容:(如果需要它处理字符串,则需要将其更改为使用字符串lisp
(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)) ))