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