Функция разбивающая строку на пары - 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
и возвращает список пар, образованных из элементов этой строки.
- Создается переменная
b
, которая инициализируется первым элементом строкиw
. - Используя цикл
loop
, функция перебирает все элементы строкиw
, начиная со второго элемента. - Когда встречается элемент
b
, функция создает новую пару, добавляет её в списокz
и сбрасывает значениеb
вnil
, чтобы не добавлять повторяющиеся пары. - Если встречается элемент
b
, то значениеb
сбрасывается вnil
, иначе значениеb
присваивается текущему элементу. - В конце функции возвращается список пар, либо если
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))
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д