Функция, формирующая 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д