Из произвольного списка и числового списка построить новый список - Lisp
Формулировка задачи:
Доброго времени суток, прощу помощи с одной задачкой. Желательно объяснение, а не решение, хотелось бы понять, почему не получается.
Из произвольного списка и числового списка построить новый список:
(A B C) (1 2 3) —> ((A) (B B) (C C C))
//функция получения подсписка(напр, (А А А)), не могу понять почему не выходит из рекурсии, когда у=0:
//с условием, что y - число, а x - атом
(defun f1 (x y)
(cond
((null y) 0)
(T (list 'x (f1 'x (- y 1))))))
//главная функция (ее не тестил, ибо с первой проблемы)
(defun F (x y)
(cond
((null x) nil)
((null y) nil)
(T (cons (f1 (car x) (car y)) (F (cdr x) (cdr y))))))Решение задачи: «Из произвольного списка и числового списка построить новый список»
textual
Листинг программы
(defun grow (w &optional (n 1) &aux (z (> n (length w)))) (when w (cons (if z w (subseq w 0 n)) (grow (unless z (subseq w n)) (1+ n))))) > (grow '(1 2 3 4 5 6 7 8 9 10)) ((1) (2 3) (4 5 6) (7 8 9 10))
Объяснение кода листинга программы
В коде определён функцией GROW рекурсивный алгоритм для получения нового списка из двух других.
- Если список W пустой, то возвращается пустой список.
- Если список W не пустой, то: — Если переменная Z не определена (её значение по умолчанию — (> N (LENGTH W))), то в список, по сути, добавляется копия первых N элементов списка W. — Если переменная Z определена, то: — В список, по сути, добавляется срез списка W от 0-го до N-го элемента. — Рекурсивно вызывается функция GROW для оставшейся части списка W (если в нём больше N элементов) и нового значения N (N+1). — Результатом будет объединение полученного списка и нового списка, полученного на следующем шаге. — Новый список будет содержать результат рекурсивного вызова функции GROW для оставшейся части списка W и нового значения N (N+1). — Значение переменной N увеличивается на 1. Код реализует рекурсивную функцию для получения списка из подмножества элементов исходного списка.