15 lines
553 B
Common Lisp
15 lines
553 B
Common Lisp
(defmacro mem-defun (name args body)
|
|
(let ((hash-name (gensym)))
|
|
`(let ((,hash-name (make-hash-table :test 'equal)))
|
|
(defun ,name ,args
|
|
(or (gethash (list ,@args) ,hash-name)
|
|
(setf (gethash (list ,@args) ,hash-name)
|
|
,body))))))
|
|
|
|
(mem-defun lcs (xs ys)
|
|
(labels ((longer (a b) (if (> (length a) (length b)) a b)))
|
|
(cond ((or (null xs) (null ys)) nil)
|
|
((equal (car xs) (car ys)) (cons (car xs) (lcs (cdr xs) (cdr ys))))
|
|
(t (longer (lcs (cdr xs) ys)
|
|
(lcs xs (cdr ys)))))))
|