Рекурсивное возведение в дробную степень - Lisp
Формулировка задачи:
Доброго вечера
Подскажите, как можно реализовать рекурсивно(!) возведение в дробную степень, при том, что она может быть еще и отрицательной?
Заранее спасибо
Решение задачи: «Рекурсивное возведение в дробную степень»
textual
Листинг программы
(defn sqrt (x) (defn go (t) cond (good-enough? t) t (go (improve t)) ) (defn good-enough? (t) < (abs (- (* t t) x)) 1E-15) (defn improve (t) average t (/ x t)) (defn average (x y) / (+ x y) 2) (defn abs (x) cond (< x 0) (- 0 x) x) (go 1.0)) (defn pow-dowble-nat (a n) (defn square (x) * x x) (defn go (n) cond (<= n 0) 1 (= 0 (mod n 2)) (square (go (/ n 2))) (* 1. a (go (- n 1))) ) (go n)) (defmacro floor(x) (java x "intValue")) (defn pow-pos (a x) (defn go (x c r) (def x2 (* 2. x) sqc (sqrt c)) (cond (= x 0.) r (< x2 1.) (go x2 sqc r) (go (- x2 1) sqc (* r sqc)) )) (* (pow-dowble-nat a (floor x)) (go (- x (floor x)) a 1)) ) (defn pow (a x) cond (< x 0) (/ 1. (pow-pos a (- 0 x))) (pow-pos a x)) (print (pow 3 7.93175) \n (pow 3 -7.93175) \n) => 6087.044996179431 1.642833264133345E-4 OK
Объяснение кода листинга программы
- Написан на языке программирования Lisp.
- Код решает задачу возведения в дробную степень.
- Возведение в дробную степень реализуется с помощью рекурсивной функции.
- Функция sqrt(x) реализует вычисление квадратного корня с помощью метода Ньютона.
- Функция good-enough?(t) проверяет, является ли текущее приближение корня достаточно точным.
- Функция improve(t) улучшает текущее приближение корня путем вычисления среднего значения.
- Функция average(x y) вычисляет среднее значение двух чисел.
- Функция abs(x) вычисляет абсолютное значение числа.
- Функция pow-dowble-nat(a n) вычисляет возведение в степень с двойным шагом.
- Функция square(x) вычисляет квадрат числа.
- Функция go(n) является вспомогательной функцией для pow-dowble-nat(a n).
- Функция floor(x) округляет число до ближайшего целого.
- Функция pow-pos(a x) вычисляет возведение в положительную дробную степень с использованием метода Ньютона.
- Функция go(x c r) является вспомогательной функцией для pow-pos(a x).
- Функция sqc(x) вычисляет квадратный корень из числа c.
- Функция pow(a x) вычисляет возведение числа a в дробную степень x.
- В функции pow используется условная конструкция cond для различных случаев вычисления возведения в степень.
- В случае, если x меньше нуля, результат вычисления равен 1/x.
- Если x равно нулю, результат равен r.
- Если x больше или равно 1, результат равен r, где r - это результат вычисления pow-pos(a x).
- Если x меньше 1, результат равен результату вычисления pow-pos(a x).
- Если x отрицательное и равно модулю n, результат равен r, где r - это результат вычисления pow-pos(a x).
- Если x отрицательное и не равно модулю n, результат равен результату вычисления pow-pos(a x), умноженному на r, где r - это результат вычисления pow-pos(a x).
- Функция print используется для вывода результатов вычислений.
- При вызове функции pow с аргументами 3 и 7.93175, результат равен 6087.044996179431.
- При вызове функции pow с аргументами 3 и -7.93175, результат равен 1.642833264133345E-4.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д