Произведение внутри списка - 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) )
Спасибо всем откликнувшимся!

Решение задачи: «Произведение внутри списка»

textual
Листинг программы
(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, которая является произведением всех чисел из списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5
Похожие ответы