Произведение внутри списка - Lisp
Формулировка задачи:
do
организовать нахождение произведения внутри списка. Т.е (1 2 3 (3 6) 2 1 (2 4) 2 ) - такого например. Нужно через do реализовать, как не могу понять, точнее не могу понять как доставать элементы из списка и производить над ними действия. Писал с помощью dolist, но он не учитывает вложенные списки. Сказали через do легче будет реализовать, посему прошу помощи. Вот пример реализации через dolist:(defun func3 (sp) (setq rez 1) (dolist (el sp) (setq rez (* rez el)) ) (print rez) )
Решение задачи: «Произведение внутри списка»
(defun mult (nums) (do ((stack (list nums)) (acc 1) current) ((null stack) acc) (setf current (pop stack)) (do () ((null current) t) (if (atom (car current)) (setf acc (* acc (car current))) (push (car current) stack)) (setf current (cdr current))))) > (mult '(1 2 3 (3 6) 2 1 (2 4) 2)) 3456
Объяснение кода листинга программы
В коде определён функцией mult с аргументом nums, который представляет собой список чисел.
С помощью цикла do с тремя переменными: stack, acc и current, происходит итерация по элементам списка nums.
Состояние переменной stack меняется при каждом проходе цикла и представляет собой список, который сначала содержит все элементы из nums.
На каждой итерации в переменную acc записывается результат умножения текущего значения acc на очередной элемент из stack.
Состояние переменной current меняется при каждом проходе внешнего цикла и сначала представляет собой первый элемент из stack, затем второй, третий и так далее.
В каждой итерации внутреннего цикла проверяется, является ли current атом (не является списком). Если это так, то результат умножения acc на current записывается в acc. Если current является списком, то его первый элемент добавляется в начало stack, а current изменяется на второй элемент.
В конце функции, когда stack становится пустым, возвращается значение acc, которое является результатом умножения всех чисел из nums.
В результате выполнения функции mult с аргументом '(1 2 3 (3 6) 2 1 (2 4) 2)' возвращается строка 3456, которая является произведением всех чисел из списка.