Из произвольного списка и числового списка построить новый список - 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 рекурсивный алгоритм для получения нового списка из двух других.

  1. Если список W пустой, то возвращается пустой список.
  2. Если список W не пустой, то: — Если переменная Z не определена (её значение по умолчанию — (> N (LENGTH W))), то в список, по сути, добавляется копия первых N элементов списка W. — Если переменная Z определена, то: — В список, по сути, добавляется срез списка W от 0-го до N-го элемента. — Рекурсивно вызывается функция GROW для оставшейся части списка W (если в нём больше N элементов) и нового значения N (N+1). — Результатом будет объединение полученного списка и нового списка, полученного на следующем шаге. — Новый список будет содержать результат рекурсивного вызова функции GROW для оставшейся части списка W и нового значения N (N+1). — Значение переменной N увеличивается на 1. Код реализует рекурсивную функцию для получения списка из подмножества элементов исходного списка.

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


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

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

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