Сначала я бы обработал плоский случай (одноцепочечный, т.е. список баз).Перейдите к списку и подсчитайте каждую базу в хеш-таблицу:
(defun count-bases (dna)
(let ((counts (make-hash-table)))
(dolist (base dna counts)
(incf (gethash base counts 0)))))
Теперь она может быть двухцепочечной, поэтому каждый элемент является не базой, а списком баз.Но мы уже знаем, как обрабатывать список баз.Для того, чтобы сосчитать в одну таблицу, нужно передать ее в рекурсивный вызов:
(defun count-bases (dna &optional (counts (make-hash-table)))
(dolist (base-or-pair dna counts)
(if (symbolp base-or-pair)
(incf (gethash base-or-pair counts 0))
(count-bases base-or-pair counts))))