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

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

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

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

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

textual
Листинг программы
  1. ;; Вставить в список lst в позицию n
  2.  
  3. (defun ins-in-pos (lst v n)
  4.   (cond ((null lst) (list v))
  5.         ((zerop n) (cons v lst))
  6.         (t (cons (car lst) (ins-in-pos (cdr lst) v (- n 1))))))
  7.  
  8. ==> INS-IN-POS
  9.  
  10. ;; Проверка
  11.  
  12. (ins-in-pos '(1 2 3 4 5) '(u u) 3)
  13.  
  14. ==> (1 2 3 (U U) 4 5)
  15.  
  16. (ins-in-pos '(1 2 3 4 5) '(u u) 5)
  17.  
  18. ==> (1 2 3 4 5 (U U))
  19.  
  20. (ins-in-pos '(1 2 3 4 5) '(u u) 14)
  21.  
  22. ==> (1 2 3 4 5 (U U))
  23.  
  24. ;; решение
  25.  
  26. (defun task (lst lv p v)
  27.   (if (> lv 0) (mapcar #'(lambda (x) (if (atom x) x (task x (- lv 1) p v))) lst)
  28.                (ins-in-pos lst v p)))
  29.  
  30. ==> TASK
  31.  
  32. ;; Проверка
  33.  
  34. (task '(a b (c d (e f) ((g h))) i (((j)))) 1 1 '(* *))
  35.  
  36. ==> (A B (C (* *) D (E F) ((G H))) I (((J)) (* *)))
  37.  
  38. (task '(a b (c d (e f) ((g h))) i (((j)))) 1 2 '(* *))
  39.  
  40. ==> (A B (C D (* *) (E F) ((G H))) I (((J)) (* *)))
  41.  
  42. (task '(a b (c d (e f) ((g h))) i (((j)))) 1 3 '(* *))
  43.  
  44. ==> (A B (C D (E F) (* *) ((G H))) I (((J)) (* *)))
  45.  
  46. (task '(a b (c d (e f) ((g h))) i (((j)))) 1 4 '(* *))
  47.  
  48. ==> (A B (C D (E F) ((G H)) (* *)) I (((J)) (* *)))
  49.  
  50. (task '(a b (c d (e f) ((g h))) i (((j)))) 1 5 '(* *))
  51.  
  52. ==> (A B (C D (E F) ((G H)) (* *)) I (((J)) (* *)))
  53.  
  54. (task '(a b (c d (e f) ((g h))) i (((j)))) 4 1 '(* *))
  55.  
  56. ==> (A B (C D (E F) ((G H))) I (((J))))
  57.  
  58. (task '(a b (c d (e f) ((g h))) i (((j)))) 3 1 '(* *))
  59.  
  60. ==> (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы