Многоуровневый список. Найти номер первого экстремального элемента - 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))) ) )
Решение задачи: «Многоуровневый список. Найти номер первого экстремального элемента»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д