Задача : Поиск делителя - Lisp
Формулировка задачи:
Решение задачи: «Задача : Поиск делителя»
- (defun task (num n &optional (c 0) (p 0))
- (cond ((zerop num) (/ p c))
- ((= 1 n) (task (\ num 10) (- n 1) (+ c 1) (rem num 10)))
- (t (task (\ num 10) (- n 1) (+ c 1) p))))
- ==> task
- (task 45632 2)
- ==> 3/5
- (task 45632 1)
- ==> 2/5
- (task 45632 4)
- ==> 1
Объяснение кода листинга программы
В коде определена функция task
, которая принимает три аргумента: num
(числитель), n
(знаменатель) и два необязательных аргумента c
(счетчик циклов) и p
(результат деления).
Если числитель равен нулю, то функция возвращает результат деления, который сохраняется в переменной p
.
Если знаменатель равен единице, то функция вызывает саму себя, уменьшая знаменатель на единицу и увеличивая счетчик циклов на единицу.
Если выполняется третье условие, то функция вызывает саму себя, передавая в качестве аргументов числитель, уменьшенный на десять, знаменатель, уменьшенный на единицу, увеличенный на единицу счетчик циклов и переменную p
.
Поскольку язык программирования Lisp не имеет скобок для обозначения блоков кода, следующие два условия записываются в виде последовательности выражений без скобок.
Если числитель равен нулю, то функция возвращает результат деления, который сохраняется в переменной p
.
Если знаменатель равен единице, то функция вызывает саму себя, уменьшая знаменатель на единицу и увеличивая счетчик циклов на единицу.
Если выполняется третье условие, то функция вызывает саму себя, передавая в качестве аргументов числитель, уменьшенный на десять, знаменатель, уменьшенный на единицу, увеличенный на единицу счетчик циклов и переменную p
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д