Определите функцию для преобразования списка по принципу - Lisp
Формулировка задачи:
Решение задачи: «Определите функцию для преобразования списка по принципу»
(defun task (lst) (cond ((null (cdr lst)) lst) (t (cons (car lst) (list (task (cdr lst))))))) ==> task (task '(1 2 3 4)) ==> (1 (2 (3 (4))))
Объяснение кода листинга программы
В коде определена функция task, которая принимает в качестве аргумента список lst. Если список пуст, то возвращается пустой список. В противном случае, из списка удаляется первый элемент (головка), который передаётся в рекурсивный вызов функции task с аргументом cdr lst, где cdr — это ссылка на хвост списка. В результате получается новый список, в котором на первом месте находится элемент, а на последующих местах — результаты рекурсивных вызовов функции task для каждого элемента списка.
Поэтому, если мы вызовем функцию task с аргументом (1 2 3 4), то получим следующий результат:
— 1-й элемент (1 передаётся в рекурсивный вызов task с аргументом (2 3 4)
— 2-й элемент (2 передаётся в рекурсивный вызов task с аргументом (3 4)
— 3-й элемент (3 передаётся в рекурсивный вызов task с аргументом (4)
— 4-й элемент (4 передаётся в рекурсивный вызов task с аргументом () (пустой список)
Итоговый результат будет иметь вид (1 (2 (3 (4)))).