Специальные формы Do и Loop - Lisp
Формулировка задачи:
(setq L `( (1 0 1 0) (2 0 2 0) (3 0 3 0) (4 0 4 0) (5 0 5 0) )) (defun MakeList (L isEven) ( cond ((null L) `()) ((= isEven 0) ( cons (reverse (car L)) (MakeList (cdr L) 1))) (T (MakeList (cdr L) 0)) ) ) (print (MakeList L 1))
Решение задачи: «Специальные формы Do и Loop»
[8]> (defun func (lst) (do ((cnt 1 (incf cnt)) (result nil) (l lst (cdr l))) ((null l) (reverse result)) (when (evenp cnt) (setf result (cons (reverse (first l)) result))))) FUNC [9]> (func '((1 0 1 0) (2 0 2 0) (3 0 3 0) (4 0 4 0) (5 0 5 0))) ((0 2 0 2) (0 4 0 4))
Объяснение кода листинга программы
[8]> В данном коде определенная функция с именем func, которая принимает в качестве аргумента lst, который является списком. [9]> Внутри функции происходит итерация по элементам списка с помощью специальной формы do. [9]> Переменная cnt инициализируется единицей и увеличивается на единицу на каждой итерации. [9]> Переменная result инициализируется как nil и используется для накопления результата. [9]> Переменная l инициализируется первым элементом списка lst и на каждой итерации изменяется на следующий элемент списка. [9]> Условие завершения цикла ((null l) (reverse result)) проверяет, что список закончился, и если это так, то происходит обратная перестановка элементов в result и возвращается результат. [9]> Внутри цикла есть проверка (when (evenp cnt) (setf result (cons (reverse (first l)) result))), которая проверяет, является ли значение cnt четным числом, и если это так, то добавляется в result первый элемент текущего элемента списка (first l), предварительно получив его в обратном порядке (reverse (first l)). [9]> В результате выполнения функции func '((1 0 1 0) (2 0 2 0) (3 0 3 0) (4 0 4 0) (5 0 5 0))', мы получаем список ((0 2 0 2) (0 4 0 4)), где каждый элемент списка состоит из двух элементов: 0 и следующего четного элемента из исходного списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д