Список сумм первого и последнего, второго и предпоследнего и т.д - Lisp

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

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

необходимо реализовать функцию, формирующую список, состоящий из сумм первого и последнего, второго и предпоследнего элементов числового списка и т.д. Каждый элемент должен участвовать в сложении не более одного раза. Например, (1 -2 -3 4 5 6 -7 8 9) –> (10 6 -10 10 5). всего третий раз пишу на лиспе и вот совсем не выходит, помогите что не так:
(defun p3(l1 &optional l2)
(cond 
((null l1) l2)
(t(append l2 (+ (car l1) (last l1)))(p3 (butlast (caar l1)) l2)))
)
немного подправил
(defun p3(l1 &optional l2)
(cond 
((null l1) l2)
(t(append l2 (+ (car l1) (car (reverse l1))))(p3 (cdr (butlast l1)) l2)))
)

Решение задачи: «Список сумм первого и последнего, второго и предпоследнего и т.д»

textual
Листинг программы
(defun task (lst &optional (r (reverse lst)))
  (cond ((null lst) nil)
        (t (cons (+ (car lst) (car r)) (task (cdr lst) (cdr r))))))
 
==> task
 
(task '(1 2 3 4 5 6))
 
==> (7 7 7 7 7 7)

Объяснение кода листинга программы

Функция task принимает два аргумента: lst — список, и опциональный аргумент r — результат рекурсивного вызова функции с обратным списком. Если список lst пуст, функция возвращает nil. Если не пуст, то она возвращает результат сложения первых двух элементов списка, а также результат вызова функции с обратным списком. Для списка '(1 2 3 4 5 6) функция будет вызвана следующим образом:

  1. (task '(1 2 3 4 5 6))
  2. (cons (+ 1 6) (task '(2 3 4 5) '(5 6)))
  3. (cons 7 (task '(3 4 5) '(4 5 6)))
  4. (cons 7 (task '(4 5) '(5 6)))
  5. (cons 7 (task '(5) '(6)))
  6. (cons 7 (task '() '(6)))
  7. (cons 7 nil)
  8. (7 7 7 7 7 7) Полученный результат — (7 7 7 7 7 7), который и будет возвращен из функции.

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


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

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

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