Как я могу выполнить возведение в степень в Clojure? Пока мне нужно только целочисленное возведение в степень, но вопрос касается и дробей.
clojure
exponentiation
Питер
источник
источник
Ответы:
классическая рекурсия (смотри, она взрывает стек)
хвостовая рекурсия
функциональный
подлый (тоже сдувает стек, но не так легко)
библиотека
источник
В Clojure есть функция мощности, которая работает хорошо: я бы рекомендовал использовать ее вместо взаимодействия с Java, поскольку она правильно обрабатывает все числовые типы произвольной точности Clojure. Он находится в пространстве имен clojure.math.numeric-tower .
Это называется
expt
для потенцирования , а неpower
или ,pow
которые , возможно , объясняет , почему это немного трудно найти ... в любом случае , вот небольшой пример (обратите внимание , чтоuse
работает , но лучше использоватьrequire
):Напоминание об установке пакета
Вы должны сначала установить пакет Java,
org.clojure.math.numeric-tower
чтобы сделать пространство имен Clojureclojure.math.numeric-tower
доступным!В командной строке:
Затем отредактируйте
project.clj
и добавьте[org.clojure/math.numeric-tower "0.0.4"]
в вектор зависимостей.Запустите lein REPL (не закрытый REPL)
Сейчас:
или
источник
Вы можете использовать методы java
Math.pow
илиBigInteger.pow
:источник
Math/pow
сложнее, чем имяmath-pow
или какое бы то ни было имя, если бы существовал эквивалент clojure. Если уже существует простой java-метод, который делает то, что вы хотите, нет причин воссоздавать функциональность в clojure. Взаимодействие Java по своей сути не вредно.Когда этот вопрос был первоначально задан, clojure.contrib.math / expt была официальной библиотечной функцией для этого. С тех пор он переехал в clojure.math.numeric-tower.
источник
источник
(.pow 2M 100)
(Math/pow Math/E x)
это главное (заменаMath/E
на базу по вашему выбору).Если вам действительно нужна функция, а не метод, вы можете просто обернуть ее:
И в этой функции вы можете преобразовать его в
int
или подобное. Функции часто более полезны, чем методы, потому что вы можете передавать их в качестве параметров другим функциям - в этом случаеmap
мне приходит в голову.Если вам действительно нужно избегать взаимодействия с Java, вы можете написать свою собственную функцию мощности. Например, это простая функция:
Это вычисляет мощность для целой экспоненты (т.е. без корней).
Кроме того, если вы имеете дело с большими числами, вы можете использовать
BigInteger
вместоint
.А если вы имеете дело с очень большими числами, вы можете выразить их в виде списков цифр и написать свои собственные арифметические функции для потоковой передачи по ним, когда они вычисляют результат и выводят результат в какой-то другой поток.
источник
Думаю, это тоже сработает:
источник
SICP вдохновил на создание полной итеративной быстрой версии «скрытой» реализации, описанной выше.
источник
Использовать
clojure.math.numeric-tower
, ранееclojure.contrib.math
.Документация по API
источник
Реализация "хитрого" метода с хвостовой рекурсией и поддерживающей отрицательной экспонентой:
источник
Простой однострочник с использованием reduce:
источник
Пытаться
для решения с хвостовой рекурсией O (log n), если вы хотите реализовать его самостоятельно (поддерживает только положительные целые числа). Очевидно, что лучшим решением будет использование функций библиотеки, на которые указали другие.
источник
Как насчет clojure.contrib.genric.math-functions
В библиотеке clojure.contrib.generic.math-functions есть функция pow. Это всего лишь макрос для Math.pow и более «банальный» способ вызова математической функции Java.
http://clojure.github.com/clojure-contrib/generic.math-functions-api.html#clojure.contrib.generic.math-functions/pow
источник