Wie kann ich in Clojure potenzieren? Im Moment brauche ich nur eine ganzzahlige Potenzierung, aber die Frage gilt auch für Brüche.
clojure
exponentiation
Peter
quelle
quelle
Antworten:
klassische Rekursion (sehen Sie dies, es bläst Stapel)
Schwanzrekursion
funktional
hinterhältig (auch Schläge stapeln, aber nicht so leicht)
Bibliothek
quelle
Clojure verfügt über eine Power-Funktion, die gut funktioniert: Ich würde empfehlen, diese Funktion zu verwenden, anstatt über Java Interop zu arbeiten, da alle Clojure-Zahlentypen mit beliebiger Genauigkeit korrekt behandelt werden. Es befindet sich im Namespace clojure.math.numeric-Tower .
Es wird eher
expt
zur Potenzierung aufgerufen alspower
oderpow
was vielleicht erklärt, warum es ein bisschen schwer zu finden ist ... hier ist ein kleines Beispiel (Hinweis, deruse
funktioniert, aber besser genutzt wirdrequire
):Erinnerung zur Paketinstallation
Sie müssen zuerst das Java-Paket installieren
org.clojure.math.numeric-tower
, um den Clojure-Namespaceclojure.math.numeric-tower
zugänglich zu machen !In der Befehlszeile:
Bearbeiten
project.clj
Sie[org.clojure/math.numeric-tower "0.0.4"]
dann den Abhängigkeitsvektor und fügen Sie ihn hinzu .Starten Sie eine Lein REPL (keine Clojure REPL)
Jetzt:
oder
quelle
Sie können Java
Math.pow
oderBigInteger.pow
Methoden verwenden:quelle
Math/pow
komplizierter das Schreiben ist alsmath-pow
oder wie auch immer der Name lauten würde, wenn es ein Clojure-Äquivalent gäbe. Wenn es bereits eine einfache Java-Methode gibt, die das tut, was Sie wollen, gibt es keinen Grund, die Funktionalität in clojure neu zu erstellen. Java Interop ist nicht von Natur aus schädlich.Als diese Frage ursprünglich gestellt wurde, war clojure.contrib.math / expt die offizielle Bibliotheksfunktion, um dies zu tun. Seitdem ist es zu clojure.math.numeric-turm umgezogen
quelle
quelle
(.pow 2M 100)
(Math/pow Math/E x)
macht der Trick (durchMath/E
die Basis Ihrer Wahl ersetzen ).Wenn Sie wirklich eine Funktion und keine Methode benötigen, können Sie sie einfach umbrechen:
Und in dieser Funktion können Sie es auf
int
oder ähnlich umwandeln. Funktionen sind oft nützlicher als Methoden, weil Sie sie als Parameter an andere Funktionen übergeben können - in diesem Fallmap
fällt mir ein.Wenn Sie Java Interop wirklich vermeiden müssen, können Sie Ihre eigene Power-Funktion schreiben. Dies ist beispielsweise eine einfache Funktion:
Das berechnet die Leistung für einen ganzzahligen Exponenten (dh keine Wurzeln).
Wenn Sie mit großen Zahlen arbeiten, möchten Sie möglicherweise
BigInteger
stattdessen anstelle von verwendenint
.Wenn Sie mit sehr großen Zahlen arbeiten, möchten Sie diese möglicherweise als Ziffernlisten ausdrücken und Ihre eigenen arithmetischen Funktionen schreiben, um sie zu streamen, während sie das Ergebnis berechnen und das Ergebnis an einen anderen Stream ausgeben.
quelle
Ich denke das würde auch funktionieren:
quelle
SICP inspirierte die oben beschriebene vollständige iterative schnelle Version der 'hinterhältigen' Implementierung.
quelle
Verwenden Sie
clojure.math.numeric-tower
früherclojure.contrib.math
.API-Dokumentation
quelle
Implementierung der "hinterhältigen" Methode mit Schwanzrekursion und unterstützendem negativen Exponenten:
quelle
Ein einfacher Einzeiler mit Reduce:
quelle
Versuchen
für eine schwanzrekursive O (log n) -Lösung, wenn Sie sie selbst implementieren möchten (unterstützt nur positive Ganzzahlen). Offensichtlich ist die bessere Lösung, die Bibliotheksfunktionen zu verwenden, auf die andere hingewiesen haben.
quelle
Wie wäre es mit clojure.contrib.genric.math-Funktionen
In der Bibliothek clojure.contrib.generic.math-functions gibt es eine pow-Funktion. Es ist nur ein Makro für Math.pow und eher eine "clojureische" Art, die Java-Mathematikfunktion aufzurufen.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
quelle