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