Binary Search Tree in Scheme, cercando di utilizzare il Dr. Racket per tornare semplicemente true o false se il valore è presente in BST. Errore

voti
2

Sto usando il dottor Racket, la lingua abbastanza grande, e sto cercando di fare un semplice albero binario di ricerca in? metodo, che restituirà se un valore è nella albero binario di ricerca o no. Ha bisogno di essere generale, di accettare qualsiasi tipo di albero di ricerca (sia esso contiene stringhe, interi, ecc), ma sto correndo in questo messaggio di errore che mi sta facendo impazzire. Ogni aiuto è apprezzato, ecco il codice:

A CURA :: ora funziona, ma non con qualsiasi cosa, ma i numeri (o almeno non funziona con le stringhe) .. Nuovo problema:

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

L'errore che sto ricevendo dice:

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

Quando si usa:

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

come input.

È pubblicato 05/12/2010 alle 04:46
fonte dall'utente
In altre lingue...                            


4 risposte

voti
2

Si consiglia di non avvolgere gli argomenti in un altro insieme di parentesi, in modo da utilizzare

(bstsearch  (cadr tree) value)

invece di

(bstsearch  ((cadr tree) value))
Risposto il 05/12/2010 a 05:00
fonte dall'utente

voti
2

Un problema è che avete la vostra <e> invertita. Supponendo che si desidera che il sub struttura a sinistra per essere il più piccolo, poi (<value (albero auto)) dovrebbe chiamare di nuovo con il (albero CADR).

Inoltre si dovrebbe usare #t invece di (#t).

Risposto il 05/12/2010 a 05:25
fonte dall'utente

voti
3

Per quanto riguarda il tuo nuovo numero, <e> funziona solo per i numeri. Una soluzione semplice sarebbe quella di passare le funzioni di confrontare come argomenti per la vostra procedura bstsearch.

Inoltre, come accennato prima, si prega di far rientrare il codice correttamente.

Risposto il 05/12/2010 a 06:23
fonte dall'utente

voti
1

Il tuo problema di recente affrontato è a causa della vostra funzione di confronto "=". Se si modifica che con "uguali?" funzione dovrebbe essere generico e lavorare in qualsiasi tipo di dati. Comparatori dovrebbero anche cambiare se si vuole rendere generico. È necessario prendere da utente come input versione in modo generico di esso dovrebbe essere:

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

  ))
  • la funzione di confronto deve essere in formato (XX -> booleano), "<", ">", "? stringa <" sono costruite negli esempi, ma si può scrivere il proprio operatore di confronto per la propria struttura di dati troppo

  • Si noti che la condizione di parità è sulla linea 2.. Spero che aiuti :)

Risposto il 06/04/2011 a 10:05
fonte dall'utente

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