Добавление единицы каждому второму элементу списка - Lisp
Формулировка задачи:
Передо мной стоит задач заполнить список и вывести его, при этом каждый второй символ должен быть на единицу выше. Сам я написал программу которая добавляет единицу ко всем элементам списка, и мне не как не приходит в голову как переделать ее под нужный вариант. Код прилагаю.
Надеюсь на вашу помощь.
(defun test (ls x)
(do ((curls ls (cdr curls)) res)
((null curls) (nreverse res))
(setf res (cons (+ x (first curls)) res))))
(test '(1 2 3) 1)
=> (2 3 4)Решение задачи: «Добавление единицы каждому второму элементу списка»
textual
Листинг программы
(defun inc-every (lst) (cond ((null lst) nil) (t (cons (+ 1 (car lst)) (inc-every (cdr lst)))))) ==> inc-every (inc-every '(1 2 3 4 5)) ==> (2 3 4 5 6)
Объяснение кода листинга программы
В данном коде представлена функция inc-every, которая принимает в качестве аргумента список lst. Если список пустой, то возвращается nil. В противном случае, возвращается новый список, в котором каждый второй элемент исходного списка увеличен на единицу.
Код функции:
defun inc-every (lst)- объявление функции с именемinc-everyи аргументомlstтипа список.(cond ((null lst) nil) - проверка условия: если список пустой, то возвращаемnil`.- `(t (cons (+ 1 (car lst)) (inc-every (cdr lst)))) - проверка условия: если список не пустой, то возвращаем новый список, в котором каждый второй элемент увеличен на единицу.
cons- создание нового списка с помощью парыcarиcdr.+ 1 (car lst)- увеличение первого элемента списка на единицу.(inc-every (cdr lst))- рекурсивный вызов функции для оставшейся части списка.
)' - закрытие условной конструкцииcond`.inc-every '(1 2 3 4 5))- вызов функцииinc-everyс аргументом(1 2 3 4 5).>(2 3 4 5 6)- вывод результата вызова функцииinc-every.