Не могу дописать код - Lisp

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте, помогите пожалуйста, есть задание "Даны число и S-выражение, состоящее из чисел.ИСПОЛЬЗУЯ ТОЛЬКО БАЗОВЫЕ КОМАНДЫ ТИПА CAR CDR CONS ATOM и т.п., определить функцию, возвращающую количество элементов на всех уровнях этого S-выражения, которые равны данному числу. К примеру "5 (4 5 ((3 5 (4)) 2) 2 5 6)", ответом будет "3", я смог написать код , подсчитывающий количество цифр только если S-выражение имеет один уровень (к примеру 5'( 2 3 4 5 6 7) ), и не хватает ума используя проверку дописать код который смог бы грамотно и правильно считать элементы на всех уровнях. Ниже напишу свой код. Большое спасибо всем тем, кто откликнется.
(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)))
)
)

Решение задачи: «Не могу дописать код»

textual
Листинг программы
(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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5