Максимальный возрастающий подсписок - Lisp

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

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

Ребят, помогите пожалуйста! Задание:Построить максимальный растущий подсписок для заданного числового списка. Например, для списка (2 3 1 -1 2 5 10 0 8) есть шесть максимальных растущих подсписков: (2 3 5 10), (1 2 5 10), (-1 2 5 10), (-1 2 5 8 ), (2 3 5 8) и (1 2 5 8). Подсписок на 4 позиции должен быть меньше списке.

Решение задачи: «Максимальный возрастающий подсписок»

textual
Листинг программы
  1. ;; Генерация очередной битовой шкалы
  2.  
  3. (defun next-scale (sc)
  4.   (cond ((null sc) nil)
  5.         ((= 0 (car sc)) (cons 1 (cdr sc)))
  6.         (t (cons 0 (next-scale (cdr sc))))))
  7.  
  8. ;; Получение подсписка по шкале
  9.  
  10. (defun get-list (lst scale)
  11.   (remove nil (mapcar (lambda (x y) (if (zerop x) nil y)) scale lst)))
  12.  
  13. ;; Выделение списков максимальной длины
  14.  
  15. (defun max-lst (lst)
  16.   (let ((m (apply 'max (mapcar 'length lst))))
  17.     (remove-if (lambda (x) (< (length x) m)) lst)))
  18.  
  19. ;; Собственно решение:
  20.  
  21. (defun task (lst &optional (sc (cons 1 (replicate 0 (- (length lst) 1)))) (res nil))
  22.   (cond ((zerop (apply '+ sc)) (max-lst res))
  23.         (t (let ((a (get-list lst sc)))
  24.              (if (apply '< a) (task lst (next-scale sc) (cons a res))
  25.                               (task lst (next-scale sc) res))))))
  26.  
  27. ==> TASK
  28.  
  29. (task '(2 3 1 -1 2 5 10 0 8))
  30.  
  31. ==> ((-1 2 5 8) (1 2 5 8) (2 3 5 8) (-1 2 5 10) (1 2 5 10) (2 3 5 10))

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


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

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

12   голосов , оценка 4.083 из 5

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

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

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