Пример LISP задача
Формулировка задачи:
Решение задачи: «Пример LISP задача»
(defun task (n) (let ((r nil) (d nil) (m n) (k 0)) (loop (when (zerop m) (return nil)) (setq k (rem m 10) m (truncate (/ m 10))) (when (> k 0) (push k d))) (dotimes (i n r) (let ((s 0) (ii (+ i 1))) (dolist (k d nil) (setq s (+ s (rem ii k)))) (when (zerop s) (push ii r))))))
Объяснение кода листинга программы
В коде представлена функция на языке Lisp с именем task, которая принимает один аргумент n.
В первой части кода определяется начальное значение r равное nil, которое будет использоваться в цикле.
Затем код переходит к циклу loop, который выполняется до тех пор, пока m не станет равным нулю. В каждой итерации цикла значение k увеличивается на 10, а m округляется вниз до ближайшего целого числа и делится на 10. Если k больше нуля, то число k добавляется в конец списка d.
После завершения цикла loop, код переходит к циклу dotimes, который выполняется n раз. В каждой итерации цикла значение i увеличивается на 1, а r остается равным nil.
Внутри цикла dotimes определен еще один внутренний цикл dolist, который выполняется для каждого элемента списка d. В каждой итерации внутреннего цикла значение ii увеличивается на 1, а s остается равным 0.
Если внутренний цикл dolist завершился, то это означает, что список d пуст, поэтому значение ii добавляется в начало списка r.
Когда внутренний цикл dotimes завершается, функция task возвращает список r.