Список делителей числа - 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.