Заменить число на его глубину вложения - Lisp

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

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

2. Напишите функцию, заменяющую Y на число, равное глубине вложения Y в W, например, Y=a, W=((a b) a (c (a (a d)))) -> ((2 b) 1 (c (3 (4 d)))). Я пользуюсь HomeLisp, не могли бы написать, я не понимаю.

Решение задачи: «Заменить число на его глубину вложения»

textual
Листинг программы
(defun task (el lst &optional (lv 1))
  (cond ((null lst) nil)
        ((eq el (car lst)) (cons lv (task el (cdr lst) lv)))
        ((listp (car lst)) (cons (task el (car lst) (+ lv 1)) (task el (cdr lst) lv)))
        (t (cons (car lst) (task el (cdr lst) lv))))) 
 
==> TASK
 
(task 'a '((a b) a (c (a (a d)))))
 
==> ((2 B) 1 (C (3 (4 D))))
 
(defun task (el lst &optional (lv 1))
  (mapcar (lambda (x) (cond ((eq el x) lv)
                            ((listp x) (task el x (+ lv 1)))
                            (t x))) lst))
 
==> TASK
 
(task 'a '((a b) a (c (a (a d)))))
 
==> ((2 B) 1 (C (3 (4 D))))

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

В коде определена функция task, которая принимает три аргумента: el, lst и опциональный аргумент lv (по умолчанию равный 1). Функция выполняет следующие действия:

  1. Если lst равно nil, то возвращает nil.
  2. Если el равно car lst, то возвращает (cons lv (task el (cdr lst) lv)).
  3. Если car lst является списком, то возвращает (cons (task el (car lst) (+ lv 1)) (task el (cdr lst) lv)).
  4. В противном случае возвращает (cons (car lst) (task el (cdr lst) lv)). Затем определена функция task с тем же именем, которая принимает те же аргументы, но вместо cond использует mapcar для применения lambda-функции к каждому элементу lst. В lambda-функции также используются условные операторы, аналогичные тем, что были в первой версии функции. В обоих случаях результат выполнения функции task будет зависеть от входных данных, но в обоих случаях на выходе будет список, в котором каждый элемент будет содержать вложенные элементы, соответствующие исходному списку, но с добавленным уровнем вложенности (определяемым значением lv).

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


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

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

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