Comment puis-je faire de l'exponentiation en clojure? Pour l'instant, je n'ai besoin que d'exponentiation entière, mais la question vaut aussi pour les fractions.
clojure
exponentiation
Peter
la source
la source
Réponses:
récursion classique (regardez ça, ça souffle pile)
récursion de queue
fonctionnel
sournois (souffle également la pile, mais pas si facilement)
bibliothèque
la source
Clojure a une fonction d'alimentation qui fonctionne bien: je recommanderais de l'utiliser plutôt que de passer par l'interopérabilité Java car il gère correctement tous les types de nombres à précision arbitraire Clojure. Il se trouve dans l'espace de noms clojure.math.numeric-tower .
C'est appelé
expt
à l' exponentiation plutôt quepower
oupow
ce qui explique peut-être pourquoi c'est un peu difficile à trouver ... en tout cas voici un petit exemple (note quiuse
fonctionne mais mieux utiliserrequire
):Rappel sur l'installation du package
Vous devez d'abord installer le package Java
org.clojure.math.numeric-tower
pour rendre l'espace de noms Clojureclojure.math.numeric-tower
accessible!Sur la ligne de commande:
Puis éditez
project.clj
et ajoutez[org.clojure/math.numeric-tower "0.0.4"]
au vecteur de dépendances.Démarrer un lein REPL (pas un clojure REPL)
Maintenant:
ou
la source
Vous pouvez utiliser les méthodes
Math.pow
ou JavaBigInteger.pow
:la source
Math/pow
est plus compliquéemath-pow
ou quel que soit le nom s'il y avait un équivalent clojure. S'il existe déjà une méthode java simple qui fait ce que vous voulez, il n'y a aucune raison de recréer la fonctionnalité dans clojure. L'interopérabilité Java n'est pas intrinsèquement nuisible.Lorsque cette question a été posée à l'origine, clojure.contrib.math / expt était la fonction officielle de la bibliothèque pour ce faire. Depuis, il est passé à clojure.math.numeric-tower
la source
la source
(.pow 2M 100)
(Math/pow Math/E x)
fait l'affaire (en remplaçantMath/E
par la base de votre choix).Si vous avez vraiment besoin d'une fonction et non d'une méthode, vous pouvez simplement l'envelopper:
Et dans cette fonction, vous pouvez le lancer
int
ou similaire. Les fonctions sont souvent plus utiles que les méthodes car vous pouvez les passer en tant que paramètres à d'autres fonctions - dans ce cas, celamap
me vient à l'esprit.Si vous avez vraiment besoin d'éviter l'interopérabilité Java, vous pouvez écrire votre propre fonction d'alimentation. Par exemple, c'est une fonction simple:
Cela calcule la puissance pour l'exposant entier (c'est-à-dire pas de racines).
De plus, si vous avez affaire à de grands nombres, vous pouvez utiliser à la
BigInteger
place deint
.Et si vous avez affaire à de très grands nombres, vous voudrez peut-être les exprimer sous forme de listes de chiffres et écrire vos propres fonctions arithmétiques pour les parcourir au fur et à mesure qu'ils calculent le résultat et envoient le résultat vers un autre flux.
la source
Je pense que cela fonctionnerait aussi:
la source
SICP a inspiré la version rapide itérative complète de l'implémentation «sournoise» ci-dessus.
la source
Utilisez
clojure.math.numeric-tower
, autrefoisclojure.contrib.math
.Documentation API
la source
Implémentation de la méthode "sournoise" avec récursion de queue et supportant l'exposant négatif:
la source
Un simple one-liner utilisant réduire:
la source
Essayer
pour une solution O (log n) récursive à la fin, si vous souhaitez l'implémenter vous-même (ne prend en charge que les entiers positifs). De toute évidence, la meilleure solution est d'utiliser les fonctions de bibliothèque que d'autres ont indiquées.
la source
Que diriez-vous de clojure.contrib.genric.math-functions
Il existe une fonction pow dans la bibliothèque clojure.contrib.generic.math-functions. C'est juste une macro de Math.pow et c'est plus une façon "clojureish" d'appeler la fonction mathématique Java.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
la source