Удалять только четные и выполнить условие с вложенными подсписками - Lisp

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

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

Задача такова: Сделать так,чтобы удаляло только четные, те, которые делятся на 2 без остатка, и выполнить условие с вложенными подсписками. Задание 1_5 В произвольном списке удалить элементы с номерами N и M (без учета скобок)
(defun din (n m l)
  (cond
    ((null l) nil)
    ( (not(atom (car l))) ( cons (din  n  m (car l)) (din  (- n (length (car l))) (- m (length (car l))) (cdr l))) )
    ((or (= n 1) (= m 1))   (din (- n 1) (- m 1) (cdr l)) )
    (t (cons (car l) (din (- n 1) (- m 1) (cdr l))))
  )
)

Решение задачи: «Удалять только четные и выполнить условие с вложенными подсписками»

textual
Листинг программы
(defun drop (w n m)
  (loop for a in w for b from 1
        if (listp a) collect (drop a n m)
        else unless (and (numberp a)
                         (evenp a)
                         (or (= b n) (= b m)))
        collect a))
 
> (drop '(a b (a b c 4 d e 5) 4 c d 5 e) 4 7)
(A B (A B C D E 5) C D 5 E)

Объяснение кода листинга программы

В данном коде определён функционал drop, который удаляет указанное количество первых элементов из списка. Если список является вложенным, то рекурсивно вызывается функция drop для удаления элементов из вложенного списка. В данном случае, указанные элементы, которые необходимо удалить, это четные числа, которые находятся на позициях 4 и 7 в списке. Вот список с пояснениями к коду:

  1. (defun drop (w n m) - определение функции drop, которая принимает три аргумента: w (список), n (количество элементов для удаления на текущем уровне) и m (количество элементов для удаления вложенных списков).
  2. (loop for a in w for b from 1 - начало цикла, который проходит по всем элементам списка w. b - счётчик для вложенных списков.
  3. if (listp a) collect (drop a n m) - если элемент списка является списком, то рекурсивно вызывается функция drop для удаления элементов из вложенного списка.
  4. else unless (and (numberp a) (evenp a) (or (= b n) (= b m))) - если элемент не является списком, то проверяется, является ли он числом и чётным. Если это так и счётчик вложенных списков равен n или m, то элемент удаляется.
  5. collect a) - все остальные элементы, которые не удовлетворяют условиям, собираются в новый список.
  6. (drop '(a b (a b c 4 d e 5) 4 c d 5 e) 4 7) - вызов функции drop с аргументами: '(a b (a b c 4 d e 5) 4 c d 5 e), 4 и 7.

  7. (A B (A B C D E 5) C D 5 E) - результат работы функции drop.

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы