Разбить список на два подсписка - Lisp

Узнай цену своей работы

Формулировка задачи:

2) Задача. Произвольный список вида (а1,а2,...,ак) разбить на два подсписка (а1,а3,а5...) и (а2,а4,а6...). в одну функцию Спасибо

Решение задачи: «Разбить список на два подсписка»

textual
Листинг программы
(defun F (lst &optional a b)
  (if lst
      (F (cddr lst)
         (nconc a (list (first lst)))
         (if (second lst)
             (nconc b (list (second lst)))
             b))
      (list a b)))
 
> (F '(1 2 3 4 5 6 7 8 9))
((1 3 5 7 9) (2 4 6 8))

Объяснение кода листинга программы

В коде определённая функция F, которая принимает два аргумента: lst — список, который необходимо разбить на подсписки, и два опциональных аргумента a и b, которые будут использоваться для накопления результатов. Если lst не равно nil, то функция рекурсивно вызывается для оставшейся части списка (cddr lst), при этом в качестве значения первого аргумента используется результат этого вызова. Второй аргумент передаётся в функцию nconc вместе с первым элементом списка (first lst), полученным с помощью функции first. Если lst равно nil, то результатом выполнения функции является список, состоящий из двух элементов: a и b. При вызове функции F с аргументом '(1 2 3 4 5 6 7 8 9) в качестве значения a будет использован список (1 3 5 7 9), а в качестве значения b — список (2 4 6 8). Результатом выполнения функции будет список списков ((1 3 5 7 9) (2 4 6 8)).

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


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

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

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