С использованием рекурсии сделать, и пример обязательно - Lisp
Формулировка задачи:
Функция должна возвращать список позиций вхождения lst2 в lst1 и глубину нахождения lst2 в lst1.
Решение задачи: «С использованием рекурсии сделать, и пример обязательно»
textual
Листинг программы
(defn f (a l) (defn is-prefix (l) (eq? a (take (length a) l))) (defn go (i d l) (cond (atom? l) nil (null? l) nil ((def r (go (+ 1 i) d (cdr l))) (append (go 0 (+ 1 d) (car l)) (cond (is-prefix l) (cons (cons i d) r) r))))) (go 0 1 l)) (printLn (f '(1 1) '(1 1 1 2 (3 1 1 4 (1 1 1)) 6 (2 1 1)))) ........ ((0 1) (1 1) (1 2) (0 3) (1 3) (1 2))
Объяснение кода листинга программы
В данном коде используется язык программирования Lisp. Постановка задачи - реализовать рекурсивную функцию для поиска префиксов в строке.
- Создаётся функция
fс двумя аргументамиaиl. - Внутри функции
fсоздаётся вспомогательная функцияis-prefix, которая проверяет, является лиaпрефиксомl. - Далее создаётся вспомогательная функция
go, которая реализует рекурсивный алгоритм для поиска префиксов в строкеl. - В функции
goиспользуются условия для проверки на атом, на ноль и на неравенство нулю. - В случае, если
lявляется атомом, то возвращаетсяnil. - Если
lравноnil, то также возвращаетсяnil. - Если
lне равноnil, то создаётся новая переменнаяr, которая равна результату вызова функцииgoс аргументами+1иd(гдеdэто длинуa), и без аргументовlвозвращаетсяnil. - В случае, если
lне является атомом, то добавляется элементiв начало результатаr, и возвращается новый список. - Результат вызова функции
goс аргументами0и1и без аргументовlприсваивается переменнойgo. - В конце кода вызывается функция
printLnс аргументомf, что приводит к выводу списка префиксов для введённой строки. Список префиксов для строки(1 1 1 2 (3 1 1 4 (1 1 1)) 6 (2 1 1)равен((0 1) (1 1) (1 2) (0 3) (1 3) (1 2)).