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

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

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

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

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

textual
Листинг программы
  1. ;; Лучше сразу же превратить список в линейный:
  2.  
  3. (defun flat-list (lst)
  4.   (cond ((null lst) nil)
  5.         ((atom (car lst)) (cons (car lst) (flat-list (cdr lst))))
  6.         (t (append (flat-list (car lst)) (flat-list (cdr lst))))))
  7.  
  8. ==> FLAT-LIST
  9.  
  10. (flat-list '(a s ((g h (((i))) j) k l)))
  11.  
  12. ==> (A S G H I J K L)
  13.  
  14. ;; Ищем номер первого вхождения (с 1)
  15.  
  16. (defun search-el (el lst &optional (c 1))
  17.   (cond ((= el (car lst)) c)
  18.         (t (search-el el (cdr lst) (+ c 1)))))
  19.  
  20. ==> SEARCH-EL
  21.  
  22. (search-el 3 '(1 2 3 4))
  23.  
  24. ==> 3
  25.  
  26. ;; Решение задачи:
  27.  
  28. (defun task (lst)
  29.   (let* ((flist (flat-list lst))
  30.          (min (apply 'min flist))
  31.          (max (apply 'max flist))
  32.          (n-min (search-el min flist))
  33.          (n-max (search-el max flist)))
  34.     (min n-min n-max)))  
  35.  
  36. ==> TASK
  37.  
  38. (task '(3 (2 5) 1))
  39.  
  40. ==> 3
  41.  
  42. (task '(3 (2 -5) 1))
  43.  
  44. ==> 1

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы