Поиск второго по величине элемента заданного списка - Lisp
Формулировка задачи:
Напишите функцию на языке Lisp для поиска второго по величине элемента заданного списка.
может кто помочь?
Решение задачи: «Поиск второго по величине элемента заданного списка»
textual
Листинг программы
(define (fun data-lst (compare-fun? >)) (let iter ((lst (rest data-lst)) (high (first data-lst)) (s-high (second data-lst))) (cond ((null? lst) s-high) ((compare-fun? (first lst) high) (iter (rest lst) (first lst) high)) (else (iter (rest lst) high s-high)))))
Объяснение кода листинга программы
В данном коде реализован алгоритм поиска второго по величине элемента в заданном списке. Вот его шаги:
- Создаётся функция
fun, которая принимает два аргумента:data-lstиcompare-fun. - В функции
funпроисходит вызов функцииletс тремя аргументами:lst,highиs-high. - В функции
letпроисходит итерация по спискуlst. При этом в качестве начального значения используетсяrest data-lst, а в качестве конечного значения —second data-lst. - В функции
letтакже присутствует условие, которое проверяет, является ли список пустым. Если это так, то возвращается второй элемент списка, который сохраняется в переменнойs-high. - Если условие не выполняется, то происходит рекурсивный вызов функции
iterс обновлёнными значениями дляlst,highиs-high. - В рекурсивном вызове функции
iterпроверяется, является ли первый элемент списка, который сохраняется в переменнойfirst lst, больше значения переменнойhigh. Если это так, то возвращается второй элемент списка, который сохраняется в переменнойs-high. - Если условие не выполняется, то происходит ещё один рекурсивный вызов функции
iterс обновлёнными значениями дляlst,highиs-high. - В итоге, после завершения итерации по списку, в переменной
s-highбудет храниться второй по величине элемент списка. - В конце функции
funпроисходит возврат значения переменнойs-high.