Максимальный возрастающий подсписок - 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
Листинг программы
;; Генерация очередной битовой шкалы (defun next-scale (sc) (cond ((null sc) nil) ((= 0 (car sc)) (cons 1 (cdr sc))) (t (cons 0 (next-scale (cdr sc)))))) ;; Получение подсписка по шкале (defun get-list (lst scale) (remove nil (mapcar (lambda (x y) (if (zerop x) nil y)) scale lst))) ;; Выделение списков максимальной длины (defun max-lst (lst) (let ((m (apply 'max (mapcar 'length lst)))) (remove-if (lambda (x) (< (length x) m)) lst))) ;; Собственно решение: (defun task (lst &optional (sc (cons 1 (replicate 0 (- (length lst) 1)))) (res nil)) (cond ((zerop (apply '+ sc)) (max-lst res)) (t (let ((a (get-list lst sc))) (if (apply '< a) (task lst (next-scale sc) (cons a res)) (task lst (next-scale sc) res)))))) ==> TASK (task '(2 3 1 -1 2 5 10 0 8)) ==> ((-1 2 5 8) (1 2 5 8) (2 3 5 8) (-1 2 5 10) (1 2 5 10) (2 3 5 10))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д