Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.252.140] |
|
Сообщ.
#1
,
|
|
|
Имеется задание:Напишите функцию (count p x), которая подсчитывает, сколько атомов в списке x удовлетворяет предикату p (p-функция или функциональное имя). Список x не предполагается одноуровневым.
Я написала фунцию, которая создает список из атомов, удовлетворяющих предикату p. Как сделать так, чтобы она еще и подсчитывала их количество? Вот мое творение: (defun count (p x) (if (null x) nil (if (funcall p (first x)) (cons (first x) (count p (rest x))) (count p (rest x)) ))) Никак не могу ничего придумать... |
Сообщ.
#2
,
|
|
|
Если необходимо посчитать атомы "визуально", т.е. не рассматривая оканчивающий список nil, то так:
(defun count1 (p x) (if (atom x) (if (funcall p x) 1 0) (+ (count1 p (car x)) (if (null (cdr x)) 0 (count1 p (cdr x)))))) Если по сути, т.е. учитывая оканчивающий список nil, то так: (defun count2 (p x) (if (atom x) (if (funcall p x) 1 0) (+ (count2 p (car x)) (count2 p (cdr x))))) Разницу можно увидеть на следующем примере: (count1 #'symbolp '(1 (2 3) (p (c 1) (nil)))) => 3 (count2 #'symbolp '(1 (2 3) (p (c 1) (nil)))) => 8 |
Сообщ.
#3
,
|
|
|
Огромное спасибо. Теперь все понятно
|