簡體   English   中英

Scheme中的二進制搜索樹,如果BST中存在值,則嘗試使用Dr. Racket簡單地返回true或false。 錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM