2010-04-30 16 views
13
stanno guidando

Hi Im di fronte a un problema con le car e cdr funzionicar e cdr nello Schema me crazy

ad esempio:

prima ho definito una lista chiamò x

(define x (a (bc) d ((ef) g))) 

così x ora è uguale a (a (bc) d ((ef) g))

ora ad esempio ho bisogno di ottenere il g da questo lista utilizzando solo car e cdr (!! noshortcuts come caddr cddr !!) la risposta corretta è:

(car(cdr(car(cdr(cdr(cdr x)))))) 

MA come? :-(Io lavoro secondo le regole (la car dà la testa di lista e cdr dà la coda)

e invece di ottenere la risposta di cui sopra Continuo a raggiungere risposte sbagliate. uno può aiutare a capire questo. .. darmi un passo o un modo per risolvere un passo alla volta

Grazie in anticipo. sono davvero stufo di Scheme.

+0

@ (tutte le persone fantastiche che hanno risposto alla mia domanda) Capisco cosa avete scritto voi, basta avere qualche domanda | Ragazzi intendete quando raggiungo il sommo come ((g)) dovrei usare la macchina per sbarazzarmi delle parantesie esterne per ottenere (g)?| –

+1

Una delle cose che mi distingue sempre dai linguaggi basati su LISP è il ** INCREDIBLY ** cattivo schema di denominazione che tutti sembrano condividere –

+0

Quando hai '(g)', hai una lista, e hai bisogno di un atomo. Usa 'car' per ottenere il primo elemento. Allo stesso modo, se hai '((g))', devi usare 'car' due volte, prima di arrivare a' (g) 'e poi a' g'. –

risposta

35

Provate a fare un passo alla volta:

  • cdr cede l'elenco senza il primo elemento
  • auto cede il primo elemento di una lista

           x   is (a (bc) d ((ef) g)) 
             (cdr x)  is ( (bc) d ((ef) g)) 
            (cdr (cdr x))  is (  d ((ef) g)) 
           (cdr (cdr (cdr x)))  is (  ((ef) g)) 
          (car (cdr (cdr (cdr x))))  is   ((ef) g) 
        (cdr (car (cdr (cdr (cdr x))))) is   (  g) 
    (car (cdr (car (cdr (cdr (cdr x)))))) is     g 
    
+0

@Curd || quindi nella quinta riga ho usato l'auto per rimuovere le parentesi esterne (o la lista)? in tal caso, perché non ho ancora rimosso la seconda parentesi sulla linea 5 utilizzando un'altra auto prima di raggiungere l'interno e utilizzando il cdr (intendo perché postponiamo l'auto alla linea 7? –

+0

auto alla linea 5 (cioè '(auto ((ef g)) 'ti lascerebbe con' (ef) '. Se stai cercando di ottenere g, non devi buttarlo via.;) car non rimuove le parentesi, restituisce il primo elemento nel seguente elenco Se l'elenco contiene solo un elemento, l'oggetto non è più in elenco. –

0

hai provato a usare un REPL (read-eval-print-loop), quali come csi? In questo modo puoi lavorare su questo in modo interattivo, il che ti renderà più facile imparare e lavorare attraverso questo (e altri) problemi usando Scheme.

1
(cdr x) = ((bc) d ((ef) g)) 
(cdr(cdr x)) = (d ((ef) g)) 
(cdr(cdr(cdr x))) = (((ef) g)) 
(car(cdr(cdr(cdr x)))) = ((ef) g) 
(cdr(car(cdr(cdr(cdr x))))) = (g) 
(car(cdr(car(cdr(cdr(cdr x)))))) = g 
0

fallo iterativamente. Inoltre, renditi conto che lo schema guarda sempre all'indietro.

(cdr x) = ((b c) ...) 
(cdr (cdr (cdr x))) = (((ef) g)) 
(car (cdr (cdr (cdr x)))) = ((ef) g) 
(cdr (car (cdr (cdr (cdr x))))) = (g) 
(car (cdr (car (cdr (cdr (cdr x)))))) = 'g 

speranza che aiuta

3

fare lo trasforma uno alla volta. cdr ti dà una lista senza il primo elemento, la macchina ti dà il primo elemento.

(cdr (a (bc) d ((ef) g))) -> ((bc) d ((ef) g)) 
(cdr ((bc) d ((ef) g))) -> (d ((ef) g)) 
(cdr (d ((ef) g)))  -> (((ef) g)) 
(car (((ef) g)))   -> ((ef) g) <- pulls the first element out, which happens to be a list itself 
(cdr ((ef) g))    -> (g) 
(car (g))     -> 'g 
2

questo è un modo facile/compatto per ottenere il valore della lista.

(cadr (cadddr x)) 

combinando le funzioni di ripetizione, si arriva elegante di facile lettura dichiarazione.

+0

Richiesto specificamente OP senza scorciatoie – Menasheh

Problemi correlati