Вычисление произведений рекурсией - Lisp
Формулировка задачи:
Здравствуйте, пожалуйста помогите разобраться. Имеется произведение
Здесь когда первый раз вызываем ij-func то будет j=1 или j=2 (т.к в скобках указано (+ j 1) ) ?
(defun y(N) (labels ( (ij-func (i j) (/ j (* i i))) (y-iter (i j prod1 prod2) // не могу разобраться с этой функцией организующей вложенные циклы (строки 5-8) (cond ((> i N) prod2) // здесь prod 2 это произведение по i от 1 до N? ((> j N) (y-iter (+ i 1) 1 1 (* prod1 prod2))) (T (y-iter i (+ j 1) (* prod1 (ij-func i j)) prod2 ))))) // (y-iter 1 1 1 1 )))
(T (y-iter i (+ j 1) (* prod1 (ij-func i j)) prod2 )))))
Решение задачи: «Вычисление произведений рекурсией»
textual
Листинг программы
(defun prod (n) (let ((p 1)) (iter (for i from 1 to n) (iter (for j from 1 to n) (multiplying (/ j (* i i)) into p))) p)) ==> PROD (prod 5) ==> 1/24883200000 (prod 10) ==> 1/395940866122425193243875570782668457763038822400000000000000000000 (prod 2) ==> 1/4
Объяснение кода листинга программы
В коде определён функционал для вычисления произведения чисел от 1 до n с помощью рекурсии.
defun prod (n)
— определяет функциюprod
, которая принимает один аргументn
.let ((p 1))
— определяет переменнуюp
и присваивает ей значение 1.iter (for i from 1 to n)
— рекурсивный цикл, который будет проходить от 1 до n.iter (for j from 1 to n)
— вложенный цикл, который будет проходить от 1 до n.(multiplying (/ j (* i i)) into p)
— выполняет умножение текущего значенияj
на текущее значениеi
и присваивает результат переменнойp
.p)
— возвращает значение переменнойp
как результат работы функции. Значение переменнойp
будет равно произведению всех чисел от 1 до n, включая само число n. Примеры использования функции:(prod 5)
— вычисляет произведение чисел от 1 до 5, т.е. 12345=120.(prod 10)
— вычисляет произведение чисел от 1 до 10, т.е. 123456789*10=395940866122425193243875570782668457763038822400000000000000000000.(prod 2)
— вычисляет произведение чисел от 1 до 2, т.е. 1*2=2.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д