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