Двоичное дерево поиска в схеме, пытающееся использовать Dr. Racket, чтобы просто вернуть true или false, если значение присутствует в BST.ошибка - PullRequest
2 голосов
/ 05 декабря 2010

Я использую 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")

в качестве ввода.

Ответы [ 4 ]

3 голосов
/ 05 декабря 2010

Что касается вашего нового выпуска, <и> работают только для чисел. Простым решением было бы передать функции сравнения в качестве аргументов вашей процедуре bstsearch.

Также, как упоминалось ранее, пожалуйста, сделайте отступ в коде правильно.

2 голосов
/ 05 декабря 2010

Одна проблема в том, что у вас есть <и> обратное. Предполагая, что вы хотите, чтобы ваше левое поддерево было меньше, тогда (

Также вы должны использовать #t вместо (#t).

2 голосов
/ 05 декабря 2010

Не следует заключать аргументы в другой набор символов, поэтому используйте

(bstsearch  (cadr tree) value)

вместо

(bstsearch  ((cadr tree) value))
1 голос
/ 06 апреля 2011

Ваша новая проблема связана с функцией сравнения "=". Если вы измените это на «равно»? Функция должна быть универсальной и работать с любыми данными. Компараторы также должны измениться, если вы хотите сделать их общими. Вы должны взять его от пользователя в качестве входных данных, поэтому общая версия должна быть:

(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 <?" построены на примерах, но вы также можете написать свой собственный компаратор для собственной структуры данных </p>

  • Обратите внимание, что условие равенства находится в строке 2.. Надеюсь, это поможет:)

...