Рекурсивное возведение в дробную степень - 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

Объяснение кода листинга программы

  1. Написан на языке программирования Lisp.
  2. Код решает задачу возведения в дробную степень.
  3. Возведение в дробную степень реализуется с помощью рекурсивной функции.
  4. Функция sqrt(x) реализует вычисление квадратного корня с помощью метода Ньютона.
  5. Функция good-enough?(t) проверяет, является ли текущее приближение корня достаточно точным.
  6. Функция improve(t) улучшает текущее приближение корня путем вычисления среднего значения.
  7. Функция average(x y) вычисляет среднее значение двух чисел.
  8. Функция abs(x) вычисляет абсолютное значение числа.
  9. Функция pow-dowble-nat(a n) вычисляет возведение в степень с двойным шагом.
  10. Функция square(x) вычисляет квадрат числа.
  11. Функция go(n) является вспомогательной функцией для pow-dowble-nat(a n).
  12. Функция floor(x) округляет число до ближайшего целого.
  13. Функция pow-pos(a x) вычисляет возведение в положительную дробную степень с использованием метода Ньютона.
  14. Функция go(x c r) является вспомогательной функцией для pow-pos(a x).
  15. Функция sqc(x) вычисляет квадратный корень из числа c.
  16. Функция pow(a x) вычисляет возведение числа a в дробную степень x.
  17. В функции pow используется условная конструкция cond для различных случаев вычисления возведения в степень.
  18. В случае, если x меньше нуля, результат вычисления равен 1/x.
  19. Если x равно нулю, результат равен r.
  20. Если x больше или равно 1, результат равен r, где r - это результат вычисления pow-pos(a x).
  21. Если x меньше 1, результат равен результату вычисления pow-pos(a x).
  22. Если x отрицательное и равно модулю n, результат равен r, где r - это результат вычисления pow-pos(a x).
  23. Если x отрицательное и не равно модулю n, результат равен результату вычисления pow-pos(a x), умноженному на r, где r - это результат вычисления pow-pos(a x).
  24. Функция print используется для вывода результатов вычислений.
  25. При вызове функции pow с аргументами 3 и 7.93175, результат равен 6087.044996179431.
  26. При вызове функции pow с аргументами 3 и -7.93175, результат равен 1.642833264133345E-4.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы