Подсчет вхождения слова в списки LISP - PullRequest
0 голосов
/ 30 октября 2019

Так что я должен посчитать вхождение слова (или символа, если быть более точным) в список в lisp. Например, входные данные:

(freq  'c '(a c c c c (c c c e)))

должны произвести счет 7, поскольку в аргументе списка есть 7 c. У меня есть следующий код, но он не работает. Я могу сосчитать 4 с, которые являются базовыми элементами, и 3 с, которые находятся в подсписке, но я не знаю, как добавить их вместе. Кроме того, я использую только примитивные типы данных.

(defun freq (a L)
    (cond
        ((null L) 0)
        ((listp (car L)) ( (freq a (car L))) ((freq a (cdr L))))
        ((eq a (car L))(+ 1 (freq a (cdr L))))
        (t ((freq a (cdr L))))))

1 Ответ

0 голосов
/ 07 ноября 2019

Если это символ, тогда он должен быть написан с этим префиксом -> # \, а последовательность будет строкой, поэтому здесь нет необходимости в рекурсии.

(count #\c "(a c c c c (c c c e))") => 7

То, с чем вы имеете дело вВаш пример - символ (с одинарной кавычкой) через список, который содержит другие символы или минусы. Так что, если вам нужно посчитать один и тот же символ, вы можете написать что-то вроде этого:

(defparameter *nb* 0)

(defun look-deeper (test seq)
    (loop for i in seq do
          (compare test i)))

(defun compare (test item)
  (let ((type (type-of item)))
    (case type
      (symbol (when (eql test item) (incf *nb*)))
      (cons   (look-deeper test item)))))

(look-deeper 'c '(a c c c c (c c c e))) => NIL
*nb* => 7

Или что-то лучше ..

...