Специальные формы 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 Есть идеи как реализовать?

Решение задачи: «Специальные формы Do и Loop»

textual
Листинг программы
[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 и следующего четного элемента из исходного списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы