Функция, формирующая 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).

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


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

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

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