Двоичное дерево на схеме, пытаясь использовать доктора ракетку просто вернуть истинным или ложным, если значение присутствует в BST. ошибка

голоса
2

Я использую доктор рэкет, язык довольно большой, и я пытаюсь сделать простое дерево двоичного поиска «в?» метод, который будет возвращать, если значение в двоичном дереве поиска или нет. Она должна быть общей, принимая любой вид дерева поиска (будь то содержать строки, Интс и т.д.), но я бегу в это сообщение об ошибке, что сводит меня с ума. Любая помощь приветствуется, вот код:

РЕДАКТИРОВАНИЕ :: Он работает сейчас, но не с чем-либо, кроме чисел (или, по крайней мере, не работает со строками) .. Новый номер:

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

в качестве входных данных.

Задан 05/12/2010 в 04:46
источник пользователем
На других языках...                            


4 ответов

голоса
2

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

(bstsearch  (cadr tree) value)

вместо

(bstsearch  ((cadr tree) value))
Ответил 05/12/2010 в 05:00
источник пользователем

голоса
2

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

Кроме того, вы должны использовать #t вместо (#t).

Ответил 05/12/2010 в 05:25
источник пользователем

голоса
3

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

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

Ответил 05/12/2010 в 06:23
источник пользователем

голоса
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))

  ))
  • Функция Comparer должна быть в формате (XX -> Boolean), "<", ">", "? строка <" построены в примерах, но вы можете написать свой собственный компаратор для вашей собственной структуры данных слишком

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

Ответил 06/04/2011 в 10:05
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more