¿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
expt
para exponenciación en lugar depower
, opow
lo que quizá explica por qué es un poco difícil de encontrar ... de todos modos aquí está un pequeño ejemplo (nota queuse
funciona, pero un mejor usorequire
):Recordatorio sobre la instalación del paquete
Primero debe instalar el paquete de Java
org.clojure.math.numeric-tower
para que el espacio de nombres de Clojure seaclojure.math.numeric-tower
accesible!En la línea de comando:
Entonces edita
project.clj
y 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.pow
o de JavaBigInteger.pow
:fuente
Math/pow
es más complicadamath-pow
o 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/E
con 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
int
o similar. Las funciones suelen ser más útiles que los métodos porque puede pasarlas como parámetros a otras funciones, en este casomap
viene 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
BigInteger
lugar 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