Реализовать функцию, включающую объект на заданное место в списке, учитывая элементы подсписков - Lisp

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

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

Помогите пожалуйста!! Реализовать функцию, включающую объект на заданное место в списке, учитывая элементы подсписков. Например, результатом применения функции к аргументам ’2 ’(x) ’(a (b c (d)) e) должен быть ’(a ((x) c (d)) e) (на место второго по счету атома вставляется ’(x).

Решение задачи: «Реализовать функцию, включающую объект на заданное место в списке, учитывая элементы подсписков»

textual
Листинг программы
;; Вспомогательная функция, превращающая список в список атомов
 
(defun flat (lst)
  (cond ((null lst) nil)
        ((atom (car lst)) (cons (car lst) (flat (cdr lst))))
        (t (append (flat (car lst)) (flat (cdr lst))))))
 
==> FLAT
 
;; Решение задачи (счёт с нуля)
 
(defun task (n obj lst)
  (cond ((null lst) nil)
        ((atom (car lst)) (if (zerop n) (cons obj (cdr lst)) (cons (car lst) (task (- n 1) obj (cdr lst)))))
        (t (let ((l (length (flat (car lst)))))
                 (if (<= n l) (cons (task n obj (car lst)) (cdr lst))
                              (cons (car lst) (task (- n l) obj (cdr lst))))))))
 
==> TASK
 
(task 0 '(x) '(a (b c (d)) e))
 
==> ((X) (B C (D)) E)
 
(task 1 '(x) '(a (b c (d)) e))
 
==> (A ((X) C (D)) E)
 
(task 2 '(x) '(a (b c (d)) e))
 
==> (A (B (X) (D)) E)
 
(task 3 '(x) '(a (b c (d)) e))
 
==> (A (B C ((X))) E)
 
(task 4 '(x) '(a (b c (d)) e))
 
==> (A (B C (D)) E)

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

В коде представлена функция flat, которая принимает список и возвращает список атомов. Это достигается с помощью рекурсии и использования условия atom, которое проверяет, является ли элемент списка атомом. Если это так, то он добавляется в новый список, в противном случае, если элемент является списком, функция вызывает саму себя для этого элемента и объединяет результаты. Вторая функция task представляет решение задачи. Она принимает три аргумента: номер n, объект obj и список lst. Функция также использует рекурсию и условие atom для решения задачи. Если n равно нулю, то объект obj добавляется в список. Если n больше нуля и меньше длины списка, то функция вызывает саму себя для n-1 и объекта obj, а результат добавляет в новый список. Если n больше или равно длине списка, то функция возвращает исходный список без изменений. Пример использования функции task показывает, как она работает. Функция вызывается с n=0, объектом x и списком (a (b c (d)) e). Функция возвращает (x) (b c (d)) e). Затем функция вызывается с n=1, и возвращает (a ((x) c (d)) e). Затем функция вызывается с n=2, и возвращает (a (B (X) (D)) E). И, наконец, функция вызывается с n=3, и возвращает (a (B C ((X))) E). Это показывает, как функция task вставляет объект x на заданное место в списке, учитывая элементы подсписков.

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


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

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

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