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

Объяснение кода листинга программы

В данном коде:

  1. Создаётся функция list-div с аргументом n (номер функции - 1).
  2. В функции используется let для создания переменной res (результат) со значением nil (пустой список).
  3. Используется mapcar для применения анонимной функции к списку чисел от truncate 1 (/ n 2) (для чётных чисел).
  4. Анонимная функция проверяет остаток от деления n на текущее число m с помощью zerop (если остаток равен нулю, то число является делителем).
  5. Если число является делителем, то оно добавляется в res с помощью push m res.
  6. В конце функции возвращается res. Используя данную функцию, вы получите список делителей числа n.

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


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

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

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