Categorías
Programming Languages

Código Lisp: agregar dos listas

¿Podemos tener una función que pueda sumar dos listas a una, como (add ‘(1 2 3)’ (4 5 6)) = (5 7 9)

(defun add-two-list (l r)
; e.g. (1 2 3) (2 3 4)
; returns (3 5 7)
  (setf return-value '())
  (loop for i from 0 to (- (length l) 1)
        do (setf return-value (cons (+ (nth i l) (nth i r)) return-value))
)
 (reverse return-value)
)

Si ampliamos esta función para agregar varias listas, entonces necesitamos lo siguiente:

(defun final-get-sum ( l   n )
; get final average value
; e.g. (final-get-sum '((1 1 1) (1 1 1) (1 1 1)) 3)
; returns (3 3 3)
  (cond ((null (car l)) (get-n-zero  n) )
        (t (add-two-list (car l) (final-get-sum (cdr l) n))
        ))
)
 
(defun add-two-list (l r)
; e.g. (1 2 3) (2 3 4)
; returns (3 5 7)
  (setf return-value '())
  (loop for i from 0 to (- (length l) 1)
        do (setf return-value (cons (+ (nth i l) (nth i r)) return-value))
)
 (reverse return-value)
)
 
 
(defun get-n-zero (n)
; get a list with n zeros
 (cond ((equal n 0) nil)
       (t (cons 0 (get-n-zero (- n 1)))))
)

Si vamos más allá, podemos calcular el promedio de una lista como
((1 1 1)
(2 2 2)
(3 3 3))
= (2 2 2)

Código

  Líneas de comando para usar CVS de forma remota
(defun final-get-average (l n)
; l is the final sum, n is the divider =  (length l).
; e.g. 
  (cond ((null (car l)) nil)
        (t (cons (/ (car l) n) (final-get-average (cdr l) n))))
)

Puede ser setf no es un buen uso aquí. Pero el código anterior seguramente funciona.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *