Como posso fazer exponenciação em clojure? Por enquanto, estou precisando apenas da exponenciação inteira, mas a questão vale para as frações também.
clojure
exponentiation
Peter
fonte
fonte
Respostas:
recursão clássica (observe isso, explode pilha)
recursão da cauda
funcional
furtivo (também sopra pilha, mas não tão facilmente)
biblioteca
fonte
Clojure tem uma função de potência que funciona bem: eu recomendo usar isso em vez de usar a interoperabilidade Java, uma vez que lida com todos os tipos de número de precisão arbitrária do Clojure corretamente. Ele está no namespace clojure.math.numeric-tower .
É chamado
expt
de exponenciação em vez depower
ou opow
que talvez explique por que é um pouco difícil de encontrar ... de qualquer maneira, aqui está um pequeno exemplo (observe queuse
funciona, mas é melhor usarrequire
):Lembrete sobre a instalação do pacote
Você deve primeiro instalar o pacote Java
org.clojure.math.numeric-tower
para tornar o namespace Clojureclojure.math.numeric-tower
acessível!Na linha de comando:
Em seguida, edite
project.clj
e adicione[org.clojure/math.numeric-tower "0.0.4"]
ao vetor de dependências.Inicie um REPL lein (não um REPL clojure)
Agora:
ou
fonte
Você pode usar métodos java
Math.pow
ouBigInteger.pow
:fonte
Math/pow
é mais complicado do quemath-pow
ou qualquer que seja o nome se houvesse um equivalente de clojure. Se já existe um método java simples que faz o que você deseja, não há razão para recriar a funcionalidade no clojure. A interoperabilidade Java não é inerentemente prejudicial.Quando essa pergunta foi feita originalmente, clojure.contrib.math / expt era a função oficial da biblioteca para fazer isso. Desde então, mudou para clojure.math.numeric-tower
fonte
fonte
(.pow 2M 100)
(Math/pow Math/E x)
faz o truque (substituindoMath/E
com a base de sua escolha).Se você realmente precisa de uma função e não de um método, pode simplesmente envolvê-la:
E nesta função você pode lançá-lo para
int
ou similar. As funções geralmente são mais úteis do que os métodos porque você pode passá-los como parâmetros para outras funções - neste caso,map
vem à minha mente.Se você realmente precisa evitar a interoperabilidade Java, pode escrever sua própria função de energia. Por exemplo, esta é uma função simples:
Isso calcula a potência do expoente inteiro (ou seja, sem raízes).
Além disso, se estiver lidando com números grandes , você pode usar em
BigInteger
vez deint
.E se você estiver lidando com números muito grandes , pode querer expressá-los como listas de dígitos e escrever suas próprias funções aritméticas para transmitir sobre eles enquanto calculam o resultado e emitem o resultado para algum outro fluxo.
fonte
Acho que isso também funcionaria:
fonte
SICP inspirou a versão rápida iterativa completa da implementação 'sorrateira' acima.
fonte
Use
clojure.math.numeric-tower
, anteriormenteclojure.contrib.math
.Documentação API
fonte
Implementação do método "sorrateiro" com recursão de cauda e expoente negativo de suporte:
fonte
Um one-liner simples usando reduzir:
fonte
Experimentar
para uma solução O (log n) recursiva na cauda, se você quiser implementá-la você mesmo (suporta apenas inteiros positivos). Obviamente, a melhor solução é usar as funções de biblioteca que outros apontaram.
fonte
Que tal funções de clojure.contrib.genric.math
Há uma função pow na biblioteca de funções clojure.contrib.generic.math. É apenas uma macro para Math.pow e é mais uma maneira "clojure" de chamar a função matemática Java.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
fonte