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