Заданы глубина подсписка, позиция и s-выражение. Включить s-выражение во все имеющиеся подсписки заданной глуб - Lisp

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

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

Вот задание: Заданы глубина подсписка, позиция и s-выражение. Включить s-выражение во все имеющиеся подсписки заданной глубины и на заданную позицию. Помогите, пожалуйста

Решение задачи: «Заданы глубина подсписка, позиция и s-выражение. Включить s-выражение во все имеющиеся подсписки заданной глуб»

textual
Листинг программы
;; Вставить в список lst в позицию n
 
(defun ins-in-pos (lst v n)
  (cond ((null lst) (list v))
        ((zerop n) (cons v lst))
        (t (cons (car lst) (ins-in-pos (cdr lst) v (- n 1))))))
 
==> INS-IN-POS
 
;; Проверка
 
(ins-in-pos '(1 2 3 4 5) '(u u) 3)
 
==> (1 2 3 (U U) 4 5)
 
(ins-in-pos '(1 2 3 4 5) '(u u) 5)
 
==> (1 2 3 4 5 (U U))
 
(ins-in-pos '(1 2 3 4 5) '(u u) 14)
 
==> (1 2 3 4 5 (U U))
 
;; решение
 
(defun task (lst lv p v)
  (if (> lv 0) (mapcar #'(lambda (x) (if (atom x) x (task x (- lv 1) p v))) lst)
               (ins-in-pos lst v p)))
 
==> TASK
 
;; Проверка
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 1 1 '(* *)) 
 
==> (A B (C (* *) D (E F) ((G H))) I (((J)) (* *)))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 1 2 '(* *)) 
 
==> (A B (C D (* *) (E F) ((G H))) I (((J)) (* *)))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 1 3 '(* *)) 
 
==> (A B (C D (E F) (* *) ((G H))) I (((J)) (* *)))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 1 4 '(* *)) 
 
==> (A B (C D (E F) ((G H)) (* *)) I (((J)) (* *)))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 1 5 '(* *)) 
 
==> (A B (C D (E F) ((G H)) (* *)) I (((J)) (* *)))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 4 1 '(* *)) 
 
==> (A B (C D (E F) ((G H))) I (((J))))
 
(task '(a b (c d (e f) ((g h))) i (((j)))) 3 1 '(* *)) 
 
==> (A B (C D (E F) ((G (* *) H))) I (((J (* *)))))

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

В коде определены две функции: ins-in-pos и task. Функция ins-in-pos вставляет указанное s-выражение в список на заданной позиции. Рекурсивно обходит список, вставляя s-выражение во все подсписки, у которых глубина больше заданной. Вот список, описывающий работу функции ins-in-pos:

  1. (defun ins-in-pos (lst v n) (cond ((null lst) (list v)) ((zerop n) (cons v lst)) (t (cons (car lst) (ins-in-pos (cdr lst) v (- n 1)))))) Функцияtaskрекурсивно обрабатывает каждый элемент списка. Если элемент является списком, то рекурсивно обрабатывает его вложенные списки. В противном случае вставляет s-выражение в список. Вот список, описывающий работу функцииtask`:
  2. (defun task (lst lv p v) (if (> lv 0) (mapcar #'(lambda (x) (if (atom x) x (task x (- lv 1) p v))) lst) (ins-in-pos lst v p))) В приведенных примерах кода показано, как функцияtask` обрабатывает вложенные списки разной глубины и вставляет s-выражение на указанную позицию.

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


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

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

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