Una de las funciones más comunes que encontrará es la función «cons
». Toma un valor y lo sitúa en el segundo argumento, una lista.
Así es exactamente como funciona «cons
», añade un elemento a la cabeza de la lista. Puede crear una lista como sigue:
(cons 1 '(2 3 4) )
El resultado es la lista (1 2 3 4)
.
(define (agregar-elemento elem lista)
(cons elem lista))
(agregar-elemento 0 '(1 2 3))
Output: '(0 1 2 3)
(define (sumatoria lista suma)
(if (null? lista)
suma
(sumatoria
(cdr lista) (+ suma (car lista))
)
)
)
(sumatoria '(1 2 10 ) 0)
Output: 13
Esta resolución permite hacer la sumatoria de una lista, en caso de que la otra esté vacía, y de ambas en caso de que contengan elementos
(define (sumatoria lista lista2 suma)
; Caso => ambas listas vacías, devuelve suma = 0.
(if (and (null? lista)(null? lista2))
suma
; Caso => primer lista vacía
(if (null? lista)
(sumatoria '() (cdr lista2) (+ suma (car lista2) ) )
; Caso => segunda lista vacía
(if (null? lista2)
(sumatoria (cdr lista) '()
(+ suma (car lista))
)
; Caso => Ambas listas con elementos
(sumatoria (cdr lista) (cdr lista2)
(+ suma (+ (car lista) (car lista2)))
)
)
)
)
)
(sumatoria '(2 2 2 2) '(1 3 2) 0)
Output: 14
(sumatoria '() '(1 3 2) 0)
Output: 6
(sumatoria '(1 3 2) '() 0)
Output: 6
Utilizando IF
equal?
puede ser reemplazado por un =
(define (eliminar-primero elem lista)
(if (null? lista)
'()
(if (equal? elem (car lista)) ; Si el primer elemento coincide
(cdr lista) ; devuelve el resto
(cons (car lista) (eliminar-primero elem (cdr lista)))
)
)
)
Utilizando COND
(define (eliminar-primero elem lista)
(cond
((null? lista) '())
((equal? elem (car lista)) (cdr lista))
(else (cons (car lista) (eliminar-primero elem (cdr lista))))
)
)
(eliminar-primero 2 '(1 2 3 2 4))
Output: '(1 3 2 4)
(define (eliminar-todos elem lista)
(if (null? lista)
'()
; Else if
(if (= elem (car lista))
(eliminar-todos elem (cdr lista))
(cons (car lista) (eliminar-todos elem (cdr lista)))
)
)
)
Ejemplo:
Para la lista (1 2 3 2 4)
y elem = 2
:
(car lista) = 1
, no coincide. Se construye (1 ... )
.(car lista) = 2
, coincide. Se ignora y se procesa (3 2 4).(car lista) = 3
, no coincide. Se construye (3 …).(car lista) = 2
, coincide. Se ignora y se procesa (4).(car lista) = 4
, no coincide. Se construye (4 …).'()
.“Construir” significa formar una nueva lista.
Explicación:
(null? lista)
, retorna una lista vacía '()
.(car lista)
es igual al elemento buscado (equal? elem (car lista))
, no lo incluye y sigue procesando el resto de la lista (eliminar-todos elem (cdr lista))
.(cons (car lista) ...)
y sigue recursivamente con el resto de la lista.Implementación utilizando COND
(define (eliminar-todos elem lista)
(cond
((null? lista) '())
((equal? elem (car lista)) (eliminar-todos elem (cdr lista)))
(else (cons (car lista) (eliminar-todos elem (cdr lista))))
)
)
(eliminar-todos 2 '(1 2 3 2 4 2))
Output:'(1 3 4)
(define (concatenar lista1 lista2)
(if (null? lista1)
lista2
(cons (car lista1) (concatenar (cdr lista1) lista2))
)
)
(define (longitud lista)
(if (null? lista)
0
(+ 1 (longitud (cdr lista)))
)
)
(longitud '(A 1 2 3 2 4))
Output: 6
(define (invertir lista)
(if (null? lista)
'()
(concatenar (invertir (cdr lista)) (list (car lista)))
)
)
✍️ Autor: Emilio Giordano
🔗 Más resúmenes de Programación Declarativa en el repositorio