Замена в исходном списке двух подряд идущих одинаковых элементов одним - Lisp

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

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

Определите функцию, заменяющую в исходном списке два подряд идущих одинаковых элемента одним. Как это сделать?
Почему не работает код?
(DEFUN REMOVEF (LAMBDA (X LST)
      (COND ( (NULL LST) NIL )
            ( (EQ X (CAR LST)) (CDR LST) )
            (   T   (CONS (CAR LST) (REMOVEF X (CDR LST))) )
      )
   ))

Решение задачи: «Замена в исходном списке двух подряд идущих одинаковых элементов одним»

textual
Листинг программы
(defun 2-to-1 (x)
  (when x
    (cons (first x)
          (2-to-1 (rest (if (equalp (first x) (second x))
                            (rest x)
                          x))))))

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

В коде представлена функция с именем 2-to-1, которая принимает один аргумент x. Функция проверяет, является ли x не пустым списком. Если это так, то функция добавляет первый элемент списка в новый список и затем рекурсивно вызывает себя для оставшейся части списка. Если первый элемент списка равен второму, то функция вызывает себя для оставшейся части списка без добавления первого элемента в новый список. Если первый элемент списка не равен второму, то функция добавляет первый элемент списка в новый список и затем вызывает себя для оставшейся части списка. Результатом работы функции является новый список, в котором два подряд идущих одинаковых элемента заменены одним. Вот пример работы функции с результатом: (2-to-1 '(1 2 2 3 4)) Результат: (1 2 3 4) В данном примере функция 2-to-1 принимает список '(1 2 2 3 4) и заменяет два подряд идущих одинаковых элемента '2' на один, в результате чего получается список '(1 2 3 4).

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


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

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

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