¿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)
)
|
(defun add-two-list (lr); eg (1 2 3) (2 3 4); devuelve (3 5 7) (setf return-value ‘()) (bucle para i de 0 a (- (longitud l ) 1) do (setf return-value (cons (+ (nth il) (nth ir)) return-value))) (valor de retorno inverso))
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)))))
)
|
(defun final-get-sum (ln); obtiene el valor promedio final; p. ej. (final-get-sum ‘((1 1 1) (1 1 1) (1 1 1)) 3); devuelve (3 3 3) (cond ((nulo (automóvil l)) (obtener-n-cero n)) (t (agregar-dos-lista (automóvil l) (final-obtener-suma (cdr l) n))))) (defun agregar -two-list (lr); p. ej. (1 2 3) (2 3 4); devuelve (3 5 7) (setf return-value ‘()) (bucle para i de 0 a (- (longitud l) 1) do (setf return-value (cons (+ (nth il) (nth ir)) return-value))) (valor de retorno inverso)) (defun get-n-zero (n); obtener una lista con n ceros ( cond ((igual n 0) nulo) (t (cons 0 (obtener-n-cero (- 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
(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))))
)
|
(defun final-get-average (ln); l es la suma final, n es el divisor = (longitud l).; p. ej. (cond ((null (car l)) nil) (t (cons (/ (car l) ) n) (final-obtener-promedio (cdr l) n)))))
Puede ser setf no es un buen uso aquí. Pero el código anterior seguramente funciona.