Список делителей числа - Lisp
Формулировка задачи:
Определить функцию, которая принимает целое положительное число и возвращает список делителей этого числа.
(defun dividers (n) (loop for a from 1 to (truncate (/ n 2)) when (zerop (rem n a)) collect a)) > (dividers 100) (1 2 4 5 10 20 25 50) > (dividers 99) (1 3 9 11 33)
(defun dividers (n &optional (m (truncate (/ n 2)))) (cond ((zerop m) nil) ((zerop (rem n m)) (cons m (dividers n (1- m)))) ((dividers n (1- m))))) > (dividers 100) (50 25 20 10 5 4 2 1) > (dividers 99) (33 11 9 3 1)
(defun dividers (n &optional (m (truncate (/ n 2)))) (when (plusp m) (if (zerop (rem n m)) (cons m (dividers n (1- m))) (dividers n (1- m))))) > (dividers 100) (50 25 20 10 5 4 2 1) > (dividers 99) (33 11 9 3 1)
Решение задачи: «Список делителей числа»
textual
Листинг программы
(defun list-div (n) (let ((res nil)) (mapcar #'(lambda (m) (when (zerop (rem n m)) (push m res))) (truncate 1 (/ n 2))) res))
Объяснение кода листинга программы
В данном коде:
- Создаётся функция
list-div
с аргументомn
(номер функции - 1). - В функции используется
let
для создания переменнойres
(результат) со значениемnil
(пустой список). - Используется
mapcar
для применения анонимной функции к списку чисел отtruncate 1 (/ n 2)
(для чётных чисел). - Анонимная функция проверяет остаток от деления
n
на текущее числоm
с помощьюzerop
(если остаток равен нулю, то число является делителем). - Если число является делителем, то оно добавляется в
res
с помощьюpush m res
. - В конце функции возвращается
res
. Используя данную функцию, вы получите список делителей числаn
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д