¿Cómo puedo hacer exponenciación en clojure? Por ahora, solo necesito una exponenciación de números enteros, pero la pregunta también se aplica a las fracciones.
clojure
exponentiation
Pedro
fuente
fuente

Respuestas:
recursividad clásica (mira esto, sopla pila)
recursividad de cola
funcional
furtivo (también se acumulan golpes, pero no tan fácilmente)
biblioteca
fuente
Clojure tiene una función de potencia que funciona bien: recomendaría usar esto en lugar de usar la interoperabilidad de Java, ya que maneja todos los tipos de números de precisión arbitraria de Clojure correctamente. Está en el espacio de nombres clojure.math.numeric-tower .
Se llama
exptpara exponenciación en lugar depower, opowlo que quizá explica por qué es un poco difícil de encontrar ... de todos modos aquí está un pequeño ejemplo (nota queusefunciona, pero un mejor usorequire):Recordatorio sobre la instalación del paquete
Primero debe instalar el paquete de Java
org.clojure.math.numeric-towerpara que el espacio de nombres de Clojure seaclojure.math.numeric-toweraccesible!En la línea de comando:
Entonces edita
project.cljy agregue[org.clojure/math.numeric-tower "0.0.4"]al vector de dependencias.Inicie un REPL lein (no un REPL clojure)
Ahora:
o
fuente
Puede utilizar los métodos
Math.powo de JavaBigInteger.pow:fuente
Math/powes más complicadamath-powo cualquiera que sea el nombre si hubiera un equivalente de clojure. Si ya existe un método java simple que hace lo que desea, no hay razón para recrear la funcionalidad en clojure. La interoperabilidad de Java no es intrínsecamente dañina.Cuando se hizo esta pregunta originalmente, clojure.contrib.math / expt era la función oficial de la biblioteca para hacer esto. Desde entonces, se ha trasladado a clojure.math.numeric-tower
fuente
fuente
(.pow 2M 100)(Math/pow Math/E x)hace el truco (reemplazandoMath/Econ la base de su elección).Si realmente necesita una función y no un método, simplemente puede ajustarlo:
Y en esta función puedes enviarlo a
into similar. Las funciones suelen ser más útiles que los métodos porque puede pasarlas como parámetros a otras funciones, en este casomapviene a la mente.Si realmente necesita evitar la interoperabilidad de Java, puede escribir su propia función de potencia. Por ejemplo, esta es una función simple:
Eso calcula la potencia del exponente entero (es decir, sin raíces).
Además, si se trata de números grandes , es posible que desee utilizar en
BigIntegerlugar deint.Y si se trata de números muy grandes , es posible que desee expresarlos como listas de dígitos y escribir sus propias funciones aritméticas para transmitirlas a medida que calculan el resultado y envían el resultado a otra secuencia.
fuente
Creo que esto también funcionaría:
fuente
SICP inspiró la versión rápida iterativa completa de la implementación 'furtiva' anterior.
fuente
Utilice
clojure.math.numeric-tower, anteriormenteclojure.contrib.math.Documentación de API
fuente
Implementación del método "furtivo" con recursividad de cola y exponente negativo de apoyo:
fuente
Un simple de una sola línea que usa reduce:
fuente
Tratar
para una solución O (log n) recursiva de cola, si desea implementarla usted mismo (solo admite enteros positivos). Obviamente, la mejor solución es utilizar las funciones de la biblioteca que otros han señalado.
fuente
¿Qué hay de clojure.contrib.genric.math-functions
Hay una función pow en la biblioteca clojure.contrib.generic.math-functions. Es solo una macro para Math.pow y es más una forma "clojureish" de llamar a la función matemática de Java.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
fuente