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