Список делителей числа - Lisp

Узнай цену своей работы

Формулировка задачи:

Определить функцию, которая принимает целое положительное число и возвращает список делителей этого числа.
Листинг программы
  1. (defun dividers (n)
  2. (loop for a from 1 to (truncate (/ n 2))
  3. when (zerop (rem n a))
  4. collect a))
  5. > (dividers 100)
  6. (1 2 4 5 10 20 25 50)
  7. > (dividers 99)
  8. (1 3 9 11 33)
Листинг программы
  1. (defun dividers (n &optional (m (truncate (/ n 2))))
  2. (cond ((zerop m) nil)
  3. ((zerop (rem n m)) (cons m (dividers n (1- m))))
  4. ((dividers n (1- m)))))
  5. > (dividers 100)
  6. (50 25 20 10 5 4 2 1)
  7. > (dividers 99)
  8. (33 11 9 3 1)
Листинг программы
  1. (defun dividers (n &optional (m (truncate (/ n 2))))
  2. (when (plusp m) (if (zerop (rem n m))
  3. (cons m (dividers n (1- m)))
  4. (dividers n (1- m)))))
  5. > (dividers 100)
  6. (50 25 20 10 5 4 2 1)
  7. > (dividers 99)
  8. (33 11 9 3 1)

Решение задачи: «Список делителей числа»

textual
Листинг программы
  1. (defun list-div (n)
  2.   (let ((res nil))
  3.     (mapcar #'(lambda (m) (when (zerop (rem n m)) (push m res))) (truncate 1 (/ n 2)))
  4.     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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы