Функция разбивающая строку на пары - Lisp

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

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

Нужно определить функцию, разбивающую список (a b c d е) на пары ((a b) (c d) (е) ) с использованием циклов, а не рекурсии. Была такая идея
(defun pairs (lst)
(loop while ((AND (cdr lst) (cddr lst))) do ( (setq newlst (cons  newlst (list (car x) (cadr x))))
                                                               (setq lst (cddr lst))))
      if (null (cdr lst)) (setq newlst (cons nelst (list (car lst))))  (setq newlst (cons newlst (list (car lst) (cadr lst)))))
Но она оказалась нерабочей

Решение задачи: «Функция разбивающая строку на пары»

textual
Листинг программы
(defun pair (w &aux (b (car w)))
  (loop for a in (cdr w)
        when b collect (list b a) into z
        do (if b (setf b nil) (setf b a))
        finally (return (if b (append z `((,b))) z))))
 
> (pair '(a b c d e f))
((A B) (C D) (E F))
> (pair '(a b c d e))
((A B) (C D) (E))

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

В данном коде определена функция Pair, которая принимает в качестве аргумента строку w и возвращает список пар, образованных из элементов этой строки.

  1. Создается переменная b, которая инициализируется первым элементом строки w.
  2. Используя цикл loop, функция перебирает все элементы строки w, начиная со второго элемента.
  3. Когда встречается элемент b, функция создает новую пару, добавляет её в список z и сбрасывает значение b в nil, чтобы не добавлять повторяющиеся пары.
  4. Если встречается элемент b, то значение b сбрасывается в nil, иначе значение b присваивается текущему элементу.
  5. В конце функции возвращается список пар, либо если b не равно nil, то к списку пар добавляется новая пара в формате (b,). Таким образом, для строки (a b c d e f) функция вернет список пар ((a b) (c d) (e f)), а для строки (a b c d e) - список пар ((a b) (c d) (e)).

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


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

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

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