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