2010-12-05 20 views
2

Ich benutze Dr. Racket, Sprache Pretty Big, und ich versuche, eine einfache binäre Suchbaum "in?" Methode, die zurückgegeben wird, wenn ein Wert im binären Suchbaum ist oder nicht. Es muss allgemein sein und jede Art von Suchbaum akzeptieren (ob es Strings, Ints usw. enthält), aber ich stoße auf diese Fehlermeldung, die mich verrückt macht. Jede Hilfe ist willkommen, hier ist der Code:Binäre Suchstruktur in Scheme, die versucht, Dr. Racket zu verwenden, um einfach wahr oder falsch zurückzugeben, wenn in BST ein Wert vorhanden ist. Fehler

EDITED :: Es funktioniert jetzt, aber nicht mit alles andere als Zahlen (oder zumindest nicht funktioniert, mit Streichern) .. Neue Ausgabe:

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

der Fehler ich erhalte sagt:

<: expects type <real number> as 1st argument, given: "horse"; other arguments were: "horse" 

Bei Verwendung:

(bstsearch '("horse" ("cow"() ("dog"()())) ("zebra" ("yak"()())())) "horse") 

als Eingabe.

+0

Versuchen Sie mit Code-Tags, um Ihre 'Lisp' lesbar zu machen. Um dies zu tun, drücken Sie die Binär-Taste oder den Code mit vier Leerzeichen einrücken. – Blender

+0

Gotchya, danke für den Tipp! – Trevor

+1

Wenn Sie es benötigen, um mit Strings zu arbeiten, müssen Sie es ändern, um die Zeichenfolge zu verwenden? und Schnur? Methoden. Sie können auch eine make-binary-tree-Methode erstellen, die Vergleichsmethoden akzeptiert, sodass Sie BSTs erstellen können, die mit beliebigen Daten arbeiten. – oligofren

Antwort

2

Ein Problem ist, haben Sie Ihre < und> umgekehrt. Angenommen, Sie möchten, dass Ihr linker Unterbaum kleiner ist, dann sollten Sie (< Wert (Autobaum)) erneut mit dem (cadr-Baum) aufrufen.

Auch sollten Sie #t anstelle von (#t) verwenden.

+0

FESTES DANKE!Aber jetzt wird es nicht mit Strings arbeiten ... – Trevor

+0

Wenn Sie es mit Strings arbeiten müssen, müssen Sie es ändern, um die Zeichenfolge zu verwenden? und Schnur? Methoden. – oligofren

2

Sie sollten nicht die Argumente in einem anderen Satz von Pars wickeln, so verwenden

(bstsearch (cadr tree) value) 

statt

(bstsearch ((cadr tree) value)) 
+0

Danke! Es hat sich aber nichts geändert :( – Trevor

3

In Bezug auf Ihr neues Problem, < und> nur für Zahlen arbeiten. Eine einfache Lösung wäre, die Vergleichsfunktionen als Argumente an Ihre bstsearch-Prozedur zu übergeben.

Auch, wie bereits erwähnt, bitte den Code richtig einrücken.

1

Ihr neu aufgetretenes Problem ist wegen Ihrer Vergleichsfunktion "=". Wenn Sie das mit "gleich" ändern? Funktion sollte es generisch sein und in jeder Art von Daten arbeiten. Comparer sollten sich auch ändern, wenn Sie sie generisch machen wollen. Sie müssen es von Benutzern nehmen als Eingabe so generische Version von ihm sein sollten:

(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 Funktion im Format sein sollte (XX -> boolean), "<", ">", „string <? " sind in Beispielen eingebaut, aber Sie können auch einen eigenen Vergleicher für Ihre eigene Datenstruktur schreiben

  • Beachten Sie, dass die gleiche Bedingung auf der 2. Zeile ist. Ich hoffe, das hilft :)