Jak mogę potęgować w clojure? Na razie potrzebuję tylko potęgowania liczb całkowitych, ale pytanie dotyczy również ułamków.
clojure
exponentiation
Piotr
źródło
źródło
Odpowiedzi:
klasyczna rekurencja (patrz, wysadza stos)
rekurencja ogona
funkcjonalny
podstępny (również ciosy stosu, ale nie tak łatwo)
biblioteka
źródło
Clojure ma funkcję power, która działa dobrze: zalecam używanie tego zamiast przechodzenia przez interop w Javie, ponieważ poprawnie obsługuje wszystkie typy liczb Clojure o arbitralnej precyzji. Znajduje się w przestrzeni nazw clojure.math.numeric-tower .
To się nazywa
expt
dla potęgowania zamiastpower
lubpow
które być może wyjaśnia, dlaczego jest to trochę trudne do znalezienia ... i tak oto mały przykład (uwaga, żeuse
prace, ale lepsze wykorzystanierequire
):Przypomnienie o instalacji pakietu
Musisz najpierw zainstalować pakiet Java,
org.clojure.math.numeric-tower
aby udostępnić przestrzeń nazw Clojureclojure.math.numeric-tower
!W linii poleceń:
Następnie edytuj
project.clj
i dodaj[org.clojure/math.numeric-tower "0.0.4"]
do wektora zależności.Rozpocznij lein REPL (nie clojure REPL)
Teraz:
lub
źródło
Możesz użyć java
Math.pow
lubBigInteger.pow
metod:źródło
Math/pow
jest bardziej skomplikowane niżmath-pow
czy jakakolwiek byłaby nazwa, gdyby istniał odpowiednik clojure. Jeśli istnieje już prosta metoda java, która robi to, co chcesz, nie ma powodu, aby odtwarzać tę funkcjonalność w clojure. Współpraca w języku Java nie jest z natury szkodliwa.Kiedy pierwotnie zadano to pytanie, clojure.contrib.math / expt był oficjalną funkcją biblioteki, która to zrobiła. Od tego czasu przeniósł się do clojure.math.numeric-tower
źródło
źródło
(.pow 2M 100)
(Math/pow Math/E x)
załatwia sprawę (wymianaMath/E
na wybraną przez Ciebie podstawę).Jeśli naprawdę potrzebujesz funkcji, a nie metody, możesz ją po prostu opakować:
W tej funkcji możesz przesłać go do
int
lub podobnego. Funkcje są często bardziej przydatne niż metody, ponieważ można je przekazywać jako parametry do innych funkcji - w tym przypadkumap
przychodzi mi na myśl.Jeśli naprawdę chcesz uniknąć współdziałania Java, możesz napisać własną funkcję Power. Na przykład jest to prosta funkcja:
To oblicza moc dla wykładnika będącego liczbą całkowitą (tj. Bez pierwiastków).
Ponadto, jeśli masz do czynienia z dużymi liczbami, możesz użyć
BigInteger
zamiastint
.A jeśli masz do czynienia bardzo dużymi liczbami, możesz chcieć wyrazić je jako listy cyfr i napisać własne funkcje arytmetyczne, aby przesyłać je strumieniowo podczas obliczania wyniku i wyprowadzania wyniku do innego strumienia.
źródło
Myślę, że to też by działało:
źródło
SICP zainspirował pełną iteracyjną szybką wersję „podstępnej” implementacji powyżej.
źródło
Użyj
clojure.math.numeric-tower
, dawniejclojure.contrib.math
.Dokumentacja API
źródło
Implementacja metody „podstępnej” z rekurencją ogonową i obsługą wykładnika ujemnego:
źródło
Prosta jedna linijka wykorzystująca redukuje:
źródło
Próbować
dla rozwiązania ogonowo-rekurencyjnego O (log n), jeśli chcesz je zaimplementować samodzielnie (obsługuje tylko dodatnie liczby całkowite). Oczywiście lepszym rozwiązaniem jest użycie funkcji biblioteki, które wskazali inni.
źródło
A co z clojure.contrib.genric.math-functions
W bibliotece clojure.contrib.generic.math-functions znajduje się funkcja pow. Jest to po prostu makro dla Math.pow i bardziej "clojureish" sposób wywoływania funkcji matematycznej Java.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
źródło