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

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

Здравствуйте! Подскажите как решить данную задачу. На вход функции подается многоуровневый список чисел. Необходимо найти номер первого экстремального (максимального или минимального) элемента списка. Нумерация должна идти по атомам. Все что я сделал это нашел максимальный элемент в многоуровневом списке.
(defun mmax (x &optional m)
    (cond ((null x) m)
          ((atom (car x)) (mmax (cdr x)
          (if (null m)
              (car x) (max m (car x)))))
          (t (mmax (cdr x) (mmax (car x) m)))
 
)
)
как теперь найти номер этого элемента?

Код к задаче: «Многоуровневый список. Найти номер первого экстремального элемента - Lisp»

textual
;; Лучше сразу же превратить список в линейный:
 
(defun flat-list (lst)
  (cond ((null lst) nil)
        ((atom (car lst)) (cons (car lst) (flat-list (cdr lst))))
        (t (append (flat-list (car lst)) (flat-list (cdr lst))))))
 
==> FLAT-LIST
 
(flat-list '(a s ((g h (((i))) j) k l)))
 
==> (A S G H I J K L)
 
;; Ищем номер первого вхождения (с 1)
 
(defun search-el (el lst &optional (c 1))
  (cond ((= el (car lst)) c)
        (t (search-el el (cdr lst) (+ c 1)))))
 
==> SEARCH-EL
 
(search-el 3 '(1 2 3 4))
 
==> 3
 
;; Решение задачи:
 
(defun task (lst)
  (let* ((flist (flat-list lst))
         (min (apply 'min flist))
         (max (apply 'max flist))
         (n-min (search-el min flist))
         (n-max (search-el max flist)))
    (min n-min n-max)))  
 
==> TASK
 
(task '(3 (2 5) 1))
 
==> 3
 
(task '(3 (2 -5) 1))
 
==> 1

11   голосов, оценка 3.909 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы