2009-03-19 10 views
5

Tengo una función que toma una lista que tiene dos o tres elementos.¿Cómo puedo saber si una lista tiene un tercer artículo?

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

Pero este código falla con

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

en la expresión (nulo? (Ls Caddr)).

También probé

(eq? '() (caddr ls)) 

pero no funcionó bien. ¿Cómo puedo saber si hay un tercer artículo o no?

+0

Simplemente curioso. ¿Qué idioma es este, por favor? –

+0

El idioma es Scheme – Kai

Respuesta

9

No desea caddr, desea (if (null? (Cddr ls)) ... O simplemente use la longitud para encontrar la longitud de la lista y compárela con el valor que le interese.

el '() que termina una lista siempre estará en la posición de la CDR de un par, así que buscando en la posición del coche (que harán cad + r) no va a ser productivo.

4

el problema es que si usted tiene una lista con dos elementos o menos, no se puede tomar la Caddr de la misma Prueba esto:.

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

Puede haber algunos casos donde tomar la longitud de la lista puede ser ineficiente (como la lista que contiene millones de elementos); en este caso, se puede probar para ver si la lista tiene una longitud cero, uno, o dos a mano:

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

edición: En cuanto a los twoother respuestas, teniendo la cddr puede trabajar también en este caso el dominio de entrada consiste en una lista con dos o tres elementos; el tercer elemento tiene aún fallas para las listas con cero o uno. En aras de la generalidad, sugiero ir con una solución que funcione para cualquier dominio.

1

siempre sabe que su lista tiene dos o tres elementos (como usted dice que tiene), se puede hacer

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

Usted está comprobando si el segundo contras celular (cddr l) tiene un cdr o no. No tiene que comprobar si l mismo es nulo o si solo tiene un elemento, a menos que desee una función más genérica.

0

oportunidad ...

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

Por qué no usar (terceros LS)

devolverá el tercer elemento o NIL si ninguno está presente.

Cuestiones relacionadas