Из произвольного списка и числового списка построить новый список - Lisp

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

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

Доброго времени суток, прощу помощи с одной задачкой. Желательно объяснение, а не решение, хотелось бы понять, почему не получается. Из произвольного списка и числового списка построить новый список: (A B C) (1 2 3) —> ((A) (B B) (C C C))
Листинг программы
  1. //функция получения подсписка(напр, (А А А)), не могу понять почему не выходит из рекурсии, когда у=0:
  2. //с условием, что y - число, а x - атом
  3. (defun f1 (x y)
  4. (cond
  5. ((null y) 0)
  6. (T (list 'x (f1 'x (- y 1))))))
  7.  
  8. //главная функция (ее не тестил, ибо с первой проблемы)
  9. (defun F (x y)
  10. (cond
  11. ((null x) nil)
  12. ((null y) nil)
  13. (T (cons (f1 (car x) (car y)) (F (cdr x) (cdr y))))))

Решение задачи: «Из произвольного списка и числового списка построить новый список»

textual
Листинг программы
  1. (defun grow (w &optional (n 1) &aux (z (> n (length w))))
  2.   (when w (cons (if z w (subseq w 0 n))
  3.                  (grow (unless z (subseq w n)) (1+ n)))))
  4.  
  5. >  (grow '(1 2 3 4 5 6 7 8 9 10))
  6. ((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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы