Лексические замыкания и рекурсия (ну или итерация) - Lisp
Формулировка задачи:
- (defun car-begin (x) #'(lambda (str) (progn (setf x (1+ x)) (nth x str))))
- (setf car-next (car-begin -1))
- [526]> (funcall car-next '(q w e r t y))
- Q
- [527]> (funcall car-next '(q w e r t y))
- W
- [528]> (funcall car-next '(q w e r t y))
- E
- [529]> (funcall car-next '(q w e r t y))
- R
- [530]> (funcall car-next '(q w e r t y))
- T
- [531]> (funcall car-next '(q w e r t y))
- Y
- [532]> (funcall car-next '(q w e r t y))
- NIL
- (defun car-down (str)
- (cond ((funcall car-next str) (car-down str))
- (t nil)))
- (defun car-down (str)
- (if (print (funcall car-next str)) (car-down str)))
- [599]> (car-down '(q w e r t y))
- Q
- W
- E
- R
- T
- Y
- NIL
- NIL
Решение задачи: «Лексические замыкания и рекурсия (ну или итерация)»
- (defn g (l)
- (defn go (l i)
- (cond (null? l) nil
- ((def x (car l))
- (def y (cond (= 0 (mod i 2)) (/ x 2) (* x x)))
- (printLn (str i "-th element was: " x ", now: " y))
- (cons y (go (cdr l) (+ i 1)))) ))
- (go l 1))
- (printLn (g '(1 2 3 4 11 22 33 44 55 66)))
- ...........
- (1 -th element was: 1 , now: 1)
- (2 -th element was: 2 , now: 1)
- (3 -th element was: 3 , now: 9)
- (4 -th element was: 4 , now: 2)
- (5 -th element was: 11 , now: 121)
- (6 -th element was: 22 , now: 11)
- (7 -th element was: 33 , now: 1089)
- (8 -th element was: 44 , now: 22)
- (9 -th element was: 55 , now: 3025)
- (10 -th element was: 66 , now: 33)
- (1 1 9 2 121 11 1089 22 3025 33)
Объяснение кода листинга программы
В этом коде на языке Lisp определена функция g
, которая принимает список l
в качестве аргумента. Внутри функции g
определена вспомогательная функция go
, которая рекурсивно обрабатывает элементы списка l
.
Когда функция go
вызывается с начальным списком l
и индексом i
равным 1, она проверяет, является ли l
null. Если это так, она возвращает nil
. В противном случае она извлекает первый элемент x
из l
с помощью функции car
. Затем она проверяет, является ли i
четным числом с помощью оператора =
. Если это так, она возвращает x/2
. Если i
нечетное, она возвращает x*x
. В любом случае она печатает сообщение, используя функцию printLn
, которая включает индекс i
, старый элемент x
и новый элемент y
. Затем она добавляет y
в новый список, который является результатом вызова функции cons
, и передает новый список и i+1
в качестве аргументов в функцию go
.
Функция g
вызывает функцию go
с начальным списком l
и индексом i
равным 1.
Пример использования функции g
включает список [1 2 3 4 11 22 33 44 55 66]
, который передается в качестве аргумента в функцию g
. Функция g
печатает элементы списка, обработанные функцией go
, в формате i-th элемент был: x, теперь: y
, где i
— это номер текущего элемента, x
— это текущий элемент, а y
— это результат его обработки. В результате получается [1 1 9 2 121 11 1089 22 3025 33]
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д