Функция, вставляющая в первый список элементы второго списка - Lisp

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

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

примечание:

Определите на двух языках Clisp и SWI-Prolog соответственно функцию и предикат для работы со списком. Все функции и предикаты должны быть рекурсивными.  Для Clisp в теле функции использование операторов SET и SETQ не допускается, функционалы не использовать.  Для SWI-Prolog ввод списка должен запрашиваться в процессе работы программы. Примеры работы функции приведены для языка Clisp.

задание:

Создать функцию, вставляющую в список L1 элементы другого списка L2 после каждого вхождения X в L1. Например, L1=(1 2 1 5 3), X=1, L2=(+ * z)-> (1 + * z 2 1 + * z 5 3).

Решение задачи: «Функция, вставляющая в первый список элементы второго списка»

textual
Листинг программы
(defun task (lst x l &optional (r nil))
  (cond ((null lst) r)
        ((eq x (car lst)) (task (cdr lst) x l (append r (cons (car lst) l))))
        (t (task (cdr lst) x l (append r (list (car lst)))))))
 
==> TASK
 
(task '(1 2 1 5 3) 1 '(+ * z))
 
==> (1 + * Z 2 1 + * Z 5 3)

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

В коде определена функция с именем task. Она принимает три аргумента: lst — первый список, x — второй элемент, который будет вставляться в первый список, и l — результат вставки. Также у функции есть необязательный четвёртый аргумент r — результат предыдущей рекурсивной итерации. Если он не указан, то считается равным nil. Функция использует условную конструкцию cond для проверки трёх случаев:

  1. Если первый список пуст, то результатом будет r.
  2. Если второй элемент x совпадает с первым элементом lst, то вызывается рекурсивная функция task с остатком списка, вторым элементом и результатом вставки. К результату добавляется новый список, содержащий первый элемент lst.
  3. В противном случае, вызывается рекурсивная функция task с остатком списка, вторым элементом и результатом вставки. К результату добавляется новый список, содержащий первый элемент lst. Применяя данную функцию к списку '(1 2 1 5 3) и второму элементу 1, а также второму списку '(+ z), получим следующий результат: (1 + Z 2 1 + * Z 5 3)

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


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

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

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