Из произвольного списка и числового списка построить новый список - 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. Код реализует рекурсивную функцию для получения списка из подмножества элементов исходного списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д