Определить функцию высшего порядка - Lisp (229758)
Формулировка задачи:
Здравствуйте!
Имеется функция рекурсивной сортировки списка:
Ее нужно переделать с использованием функции высшего порядка (funcall).
(defun SORT (list)
(if list
((lambda (elem result)
(cond
((null result) (cons elem nil))
((= elem (car result)) result)
((> elem (car result)) (cons elem result))
(T (cons (car result) (SORT (cons elem (cdr result)))))))
(car list)
(SORT (cdr list)))))Решение задачи: «Определить функцию высшего порядка»
textual
Листинг программы
(defun f (elem lst) (cond ((null lst) (cons elem nil)) ((>= elem (car lst)) (cons elem lst)) (T (cons (car lst) (SORT (cons elem (cdr lst)) #'f))))) (defun sort (lst f) (if lst (funcall f (car lst) (sort (cdr lst) #'f)) nil)) (sort '(1 2 3 1 2 3) #'f) ==> (3 3 2 2 1 1)
Объяснение кода листинга программы
В этом коде определены две функции: f и sort.
f- это функция высшего порядка, которая принимает два аргумента:elemиlst.- Если
lstравноnil, то возвращаетсяconsсelemв качестве первого элемента иnilв качестве второго. - Если
elemбольше или равно первому элементуlst, то возвращаетсяconsсelemв качестве первого элемента иlstв качестве второго. - В противном случае, возвращается
consс первым элементомlstи отсортированным списком остальных элементов, используя рекурсивноfв качестве функции сравнения. Функцияsortпринимает два аргумента:lstи функциюf. - Если
lstне равноnil, то вызываетсяfс первым элементомlstи отсортированным списком остальных элементов, используя рекурсивноsortв качестве функции. - В противном случае, возвращается
nil. В конце кода вызывается функцияsortс аргументом'(1 2 3 1 2 3)'и#'fв качестве аргументов, что вызывает сортировку списка[1 2 3 1 2 3]с использованием функцииfв качестве функции сравнения. Возвращается отсортированный список[3 3 2 2 1 1].