Лексические замыкания и рекурсия (ну или итерация) - 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].