Определить функцию высшего порядка - 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]
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д