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