Функция, формирующая N список, содержащий суммы элементов с номерами 1 и N/2+1, 2 и N/2+2 и т. д - Lisp
Формулировка задачи:
В задаче допускается использовать любые предопределённые функции Lisp. Необходимо разработать функцию, формирующую на основе исходного списка длины N список, содержащий суммы элементов с номерами 1 и N/2+1, 2 и N/2+2 и т. д. N — аргумент функции.
Например:
Вход: (1 2 3 4 5 6 7 8 9 10).
Выход: (7 9 11 13 15).
Если можно, с комментариями, дабы понимать схему работы. Вроде и не особо сложно, как как-то решению не поддаётся. Если у кого-то найдётся время помочь, буду очень благодарен.
Были какие-то попытки, но что-то всё не то.
(setq list '(1 2 3 4 5 6 7 8 9 10)) (defun replacez (list list2) (cond ((= (/ (length list) 2) (length list2)) 0) (t (cons (nth (+ 1 (/ (length list) 2)) list) list2) (replacez list list2)) ) ) (replacez list ()) *********************** (defun f (l) (loop for a in l for b in (nthcdr (round (/ (length l) 2)) l) collect (+ a b))) *********************** (defun replacez(lst) (let* ((res nil) (n (length lst)) (k (/ n 2))) (dotimes (i k res) (setq res (append res (list (+ (car (subseq lst i (+ i 1))) (car (subseq lst (+ i k) (+ i k 1))))))) ) ) ) (replacez '(1 2 3 4 5 6 7 8 9 10)) *********************** (defun trans-list (lst) ;; последовательно создаем локальные переменные: (let* ((res nil) ;; здесь будет результат (n (length lst)) ;; длина списка (k (/ n 2))) ;; половина длины (dotimes (i k res) ;; цикл по i от 0 до k-1 (setq res ;; приклеиваем в хвост результату... (append res (list (+ (car (subseq lst i (+ i 1))) ;; список из суммы i-го и i+k-го элементов (car (subseq lst (+ i k) (+ i k 1)))))))))) *********************** (defun sum-shifted (w &optional (v (nthcdr (/ (length w) 2) w))) (when v (cons (+ (car w) (car v)) (sum-shifted (cdr w) (cdr v))))) *********************** (defun sum-shifted (w) (loop for a in w for b in (subseq w (/ (length w) 2)) collect (+ a b)))
Все представленные решения с циклами, а необходим способ решения задачи без цикла.
Решение задачи: «Функция, формирующая N список, содержащий суммы элементов с номерами 1 и N/2+1, 2 и N/2+2 и т. д»
textual
Листинг программы
(defun f (x y &rest a) (list x y a)) ==> f (f 'q 'w 1 2 3 4 5) ==> (q w (1 2 3 4 5))
Объяснение кода листинга программы
В коде определена функция с именем f. Она принимает три аргумента: x, y и дополнительное множество аргументов a. Дополнительные аргументы a могут быть любыми, но в данном случае они представлены списком чисел от 1 до N/2. Функция просто возвращает список из своих аргументов. В данном случае она вернет список (q w 1 2 3 4 5). При вызове функции f с аргументами 'q', 'w', 1, 2, 3, 4, 5, она вернет список (q w 1 2 3 4 5).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д