Список сумм первого и последнего, второго и предпоследнего и т.д - 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) функция будет вызвана следующим образом:
- (task '(1 2 3 4 5 6))
- (cons (+ 1 6) (task '(2 3 4 5) '(5 6)))
- (cons 7 (task '(3 4 5) '(4 5 6)))
- (cons 7 (task '(4 5) '(5 6)))
- (cons 7 (task '(5) '(6)))
- (cons 7 (task '() '(6)))
- (cons 7 nil)
- (7 7 7 7 7 7) Полученный результат — (7 7 7 7 7 7), который и будет возвращен из функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д