Не могу дописать код - 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) ), и не хватает ума используя проверку дописать код который смог бы грамотно и правильно считать элементы на всех уровнях. Ниже напишу свой код. Большое спасибо всем тем, кто откликнется.
Листинг программы
  1. (defun poisk (n k)
  2. (cond ((= n (car k)) (+ 1 (poisk n (cdr k))))
  3. (t (poisk n (cdr k)))))
потом я пытался его изменить и ловлю кучу ошибок
Листинг программы
  1. (defun poisk (n k)
  2. (cond ((ATOM k)
  3. (cond
  4. ((= n k) (+ 1 (poisk n(cdr k))))
  5. (t (poisk n (cdr k)))
  6. ))
  7. (t (poisk n (cdr k)))
  8. )
  9. )

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

textual
Листинг программы
  1. (defun count-atom (a w)
  2.   (cond ((null w) 0)
  3.         ((atom w) (if (= w a) 1 0))
  4.         (t (+ (count-atom a (car w))
  5.               (count-atom a (cdr w))))))
  6.  
  7. > (count-atom 5 ' (4 5 ((3 5 (4)) 2) 2 5 6))
  8. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут