Определите функцию для преобразования списка - Lisp
Формулировка задачи:
Определите функцию для преобразования списка по принципу: (A B C) ->(((A) B) C).
(использовать можно car, cdr, cons, eq, cond, eql, equal, append, reverse, move)
Решение задачи: «Определите функцию для преобразования списка»
textual
Листинг программы
(defun conv-list (lst p) (cond ((null lst) (car p)) (t (conv-list (cdr lst) (cons (append p (list (car lst))) nil))))) ==> CONV-LIST (defun task (lst) (conv-list lst nil)) ==> TASK (task '(a b c)) ==> (((A) B) C)
Объяснение кода листинга программы
В данном коде определены две функции: conv-list и task.
conv-list- это рекурсивная функция, которая принимает два аргумента:lst(список, который необходимо преобразовать) иp(результат предыдущего вызова функции). Еслиlstравноnil, то функция возвращаетcar(первый элемент)p. В противном случае, функция вызывает саму себя, передавая в качестве аргументовcdr(остаток списка после первого элемента) иcons(новое значениеp, состоящее из текущего значенияp,carи нового списка, состоящего из первого элемента исходного списка). Аргументnilиспользуется для накопления результата.task- это функция, которая принимает один аргументlst(список, который необходимо преобразовать) и вызывает функциюconv-listс аргументамиlstиnil.- В конце кода вызывается функция
taskс аргументом'(a b c'), что приводит к преобразованию списка и выводу результата:((A) B) C.