2013-09-21 2 views
1

Мне нужно написать функцию, которая учитывает все вхождения данного атома внутри списка. Это то, что у меня есть:Подсчет всех вхождений атома в список? - LISP

(defun my-count (a L) 
    (cond 
    ((null L) nil) 
    ((equal a (car L))(+ 1 (my-count a (cdr L)))) 
    (t (my-count a(cdr L))) 
    ) 
) 

По-моему, это должно сработать. Однако, когда я запускаю трассировку, я нахожу, что когда (равно автомобилю L) оценивается значение true, он делает рекурсивный вызов, но не инициализирует + 1. Очевидно, что-то мне не хватает.

ответ

3

Проблема - ваше нулевое состояние. Вы находитесь в рекурсивном Кроме того, и когда вы закончите, вы должны добавить 0, а не ноль:

(defun my-count (a L) 
    (cond 
    ((null L) 0) 
    ((equal a (car L)) (+ 1 (my-count a (cdr L)))) 
    (t (my-count a (cdr L))))) 

, такие как

? (my-count 'x '(a x b)) 
1 
? (my-count 'x '(a x x b)) 
2 
? (my-count 'x '(a b)) 
0 
+0

(FREQ 'е' (((е) е) и далее)), получив неверный счет .. –

+0

@MaksimKniazev Что такое 'freq'? Если вы ссылаетесь на 'my-count', он считает атомы в плоском списке, а не вложенном списке (дерево a.k.a.). – uselpa

+0

Как мне сделать в тестируемом? Вы можете помочь? –

Смежные вопросы