2009-03-19 1 views
5

Ho una funzione che accetta una lista che ha due o tre elementi.Come posso sapere se un elenco ha un terzo elemento?

;; expecting either ((a b c) d) or ((a b c) d e) 
(define (has-third-item ls) 
     (if (null? (caddr ls)) 
      false 
      true) 
    ) 

Ma questo codice non riesce con

mcar: expects argument of type <mutable-pair>; given() 

sull'espressione (null? (Ls Caddr)).

Ho anche provato

(eq? '() (caddr ls)) 

ma non ha funzionato neanche. Come faccio a sapere se c'è un terzo elemento o no?

+0

Solo curioso. Che lingua è questa per favore? –

+0

La lingua è Schema – Kai

risposta

9

Non vuoi caddr, vuoi (if (null? (Cddr ls)) ... Oppure usa la lunghezza per trovare la lunghezza della lista e confrontala con il valore che ti interessa.

l' '(), che termina la lista sarà sempre nella posizione cdr di una coppia, in modo da cercare nella posizione auto (che cad + r farà) non sta per essere produttivi.

4

il problema è che se si dispone di un elenco con due o meno elementi, non si può prendere la Caddr di esso Prova questo:.

(define (has-third-item lst) 
    (<= 3 (length lst))) 

Ci possono essere alcuni casi in cui prendere la lunghezza della lista può essere inefficiente (come la lista contenente milioni di oggetti); in questo caso, siamo in grado di verificare se la lista ha lunghezza zero, uno, o due a mano:

(define (has-third-item lst) 
    (not (or (null? lst) 
      (null? (cdr lst)) 
      (null? (cddr lst))))) 

edit: Per quanto riguarda i twoother risposte, durante l'assunzione del CDDR può funzionare anche in questo caso il dominio di input è costituito da una lista con due o tre elementi, has-third-item non riuscirebbe ancora per gli elenchi con zero o uno. Nell'interesse della generalità, suggerisco di andare con una soluzione che funzioni per qualsiasi dominio.

1

condizione di sapere la vostra lista ha due o tre elementi (come si dire che ha), si può fare

(define (has-third-item? l) 
    (not (null? (cddr l)))) 

si sta controllando se la seconda contro cella (cddr l) ha un cdr o meno. Non è necessario verificare se l stesso sia nullo o che abbia un solo elemento, a meno che non si desideri una funzione più generica.

0

try ...

(and l (cdr l)(cddr l)) 
0

Perché non usare (terza ls)

restituirà il terzo elemento o NIL se nessuno è presente.