Заданы глубина подсписка, позиция и 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
:
(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`:(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-выражение на указанную позицию.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д