Не могу дописать код - Lisp
Формулировка задачи:
(defun poisk (n k) (cond ((= n (car k)) (+ 1 (poisk n (cdr k)))) (t (poisk n (cdr k)))))
(defun poisk (n k) (cond ((ATOM k) (cond ((= n k) (+ 1 (poisk n(cdr k)))) (t (poisk n (cdr k))) )) (t (poisk n (cdr k))) ) )
Решение задачи: «Не могу дописать код»
(defun count-atom (a w) (cond ((null w) 0) ((atom w) (if (= w a) 1 0)) (t (+ (count-atom a (car w)) (count-atom a (cdr w)))))) > (count-atom 5 ' (4 5 ((3 5 (4)) 2) 2 5 6)) 3
Объяснение кода листинга программы
В данном коде представлена функция count-atom, которая принимает два аргумента: a и w.
В первой ветке условия cond проверяется, является ли w null. Если это так, то возвращается 0.
Во второй ветке условия cond проверяется, является ли w атомом. Если это так, то проверяется, равно ли значение w переменной a. Если это так, то возвращается 1, иначе возвращается 0.
В третьей ветке условия cond проверяется, является ли w списком. Если это так, то рекурсивно вызывается функция count-atom с аргументами a и car w, затем результат складывается с результатом вызова функции count-atom с аргументами a и cdr w.
Значение переменной a равно 5, значение переменной w равно (4 5 ((3 5 (4)) 2) 2 5 6).
Поскольку w является списком, то функция рекурсивно вызывается с аргументами a и car w, затем с аргументами a и cdr w.
Первый вызов: count-atom(a=5, w=(4 5 ((3 5 (4)) 2) 2 5 6)
count-atom(a=5, w=(3 5 (4)))
count-atom(a=5, w=4)
Второй вызов: count-atom(a=5, w=2)
Третий вызов: count-atom(a=5, w=6)
В итоге, результат вызовов функции count-atom равен 3.