Предикат, который проверяет, является ли простой список чисел монотонной последовательностью - Lisp
Формулировка задачи:
Пожалуйста, помогите решить следующую задачку!
Определить предикат, который проверяет, является ли простой список чисел монотонной последовательностью.
Заранее спасибо!
Решение задачи: «Предикат, который проверяет, является ли простой список чисел монотонной последовательностью»
textual
Листинг программы
(defun monotonic-p (lst) ( (lambda (f-rec) (f-rec (if (<= (car lst) (cadr lst)) <= >=) (cdr lst))) (lambda (acc lst) (if (cddr lst) (if (acc (car lst) (cadr lst)) (f-rec acc (cdr lst))) T))))
Объяснение кода листинга программы
В данном коде определен вспомогательный анонимный предикат (lambda), который принимает два аргумента: f-rec и lst.
- (defun monotonic-p (lst)
- ( (lambda (f-rec)
- (f-rec (if (<= (car lst) (cadr lst)) <= >=)
- (cdr lst)))
- (lambda (acc lst)
- (if (cddr lst)
- (if (acc (car lst) (cadr lst))
- (f-rec acc (cdr lst)))
- T))))
- В первой части кода создается функция с именем monotonic-p, которая принимает один аргумент lst.
- Вторая часть кода — это тело функции monotonic-p.
- Внутри функции определена еще одна анонимная функция (lambda), которая будет использоваться внутри функции monotonic-p.
- Первая анонимная функция вызывается с аргументами f-rec и lst.
- Внутри этой функции происходит проверка: если элемент списка (car lst) меньше или равен следующему элементу (cadr lst), то вызывается рекурсивно первая анонимная функция с аргументами (cdr lst).
- Вторая анонимная функция вызывается с аргументами acc и lst.
- Внутри этой функции происходит проверка: если список не пустой, то вызывается рекурсивно вторая анонимная функция с аргументами (cdr lst).
- Если условие не выполняется, то возвращается значение T.
- Если список пустой, то возвращается значение T.
- В первой анонимной функции, если условие не выполняется, то вызывается вторая анонимная функция с аргументами (cdr lst).
- Если условие не выполняется, то возвращается значение T.