Найти самый глубоко расположенный атом в произвольном списке. - Lisp

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

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

Найти самый глубоко расположенный атом в произвольном списке. Если таких несколько, вывести первый из них. Прокомментируйте код:
(defun _deepest (x i d)
 (cond ((null x) d)
          ((atom x)     (if (> i (car d)) (list i x) d))
          (T (_deepest (cdr x) i (_deepest (car x) (+ i 1) d)))))
 
(defun deepest (x)
  (cadr (_deepest x 0 (list 0 nil))))
 
(deepest '((1) 5 ((8) 9 (4)))) -> 8
(deepest '((1) 5 ((8 3) 9 (4)) 2)) -> 8
(deepest '(1)) -> 1

Решение задачи: «Найти самый глубоко расположенный атом в произвольном списке.»

textual
Листинг программы
(defun deepest (w)
  (cadr
   (labels
       ((deep (v n ac)
          (cond ((null v) ac)
                ((atom v) (if (> n (car ac)) `(,n ,v) ac))
                ((deep (cdr v) n (deep (car v) (1+ n) ac))))))
     (deep w 0 `(0 nil)))))
 
> (deepest '((1) 5 ((8) 9 (4))))
8

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

В данном коде определённая функция deepest, которая принимает один аргумент w. Этот аргумент должен быть списком. Внутри функции происходит рекурсивный обход списка до тех пор, пока не будет найден самый глубоко расположенный атом. В первой строке кода функция cadr используется для получения второго элемента списка. Далее, с помощью labels определяется внутренняя функция deep, которая принимает четыре аргумента v, n, ac и cdr v. Внутренняя функция deep проверяет следующие условия:

  1. Если v равно nil, то возвращается ac.
  2. Если v является атомом, то проверяется следующее условие: если n больше car ac, то возвращается новая списковая структура, содержащая n и v. В противном случае возвращается ac.
  3. Если v не является nil и cdr v не равно nil, то рекурсивно вызывается функция deep с аргументами cdr v, n+1 и deep (car v). В последней строке кода функция deepest вызывается с аргументом w, равным списку ((1) 5 ((8) 9 (4)). При этом, для обхода списка используется рекурсивный вызов функции deep с аргументами w, 0 и (0 nil). Таким образом, в результате выполнения кода будет выведено число 8, так как это самый глубоко расположенный атом в списке ((1) 5 ((8) 9 (4))).

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


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

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

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