code

Elixir에서 숫자를 거듭 제곱하려면 어떻게해야합니까?

codestyles 2020. 11. 30. 08:17
반응형

Elixir에서 숫자를 거듭 제곱하려면 어떻게해야합니까?


Elixir에서 지수로 숫자를 계산하려면 어떻게해야합니까?

예를 들어 2 3 은 8을 반환합니다.


사용 math 모듈 : 얼랑를

:math.pow(2,3) #=> 8.0

정수를 원하는 경우 :

:math.pow(2,3) |> round #=> 8

Erlang :math.pow에는 몇 가지 제한 사항이 있습니다. 예를 들어 실제로 높은 정수 거듭 제곱을 허용하지 않습니다.

iex(10)> :math.pow(2, 10000)
** (ArithmeticError) bad argument in arithmetic expression

런타임에서 제공하는 임의의 큰 정수로 작동하는 계산 능력에 대한 빠른 알고리즘을 쉽게 다시 구현할 수 있습니다.

defmodule Pow do
  require Integer

  def pow(_, 0), do: 1
  def pow(x, n) when Integer.is_odd(n), do: x * pow(x, n - 1)
  def pow(x, n) do
    result = pow(x, div(n, 2))
    result * result
  end
end

iex(9)> Pow.pow(2, 10000)
19950631168807583848837421626835850838234968318861924548520089498529438830...

다음은 power 함수의 마무리 호출 최적화 구현입니다.

def  pow(n, k), do: pow(n, k, 1)        
defp pow(_, 0, acc), do: acc
defp pow(n, k, acc), do: pow(n, k - 1, n * acc)

Tis는 작동합니다-그것이 작동하는 이유를 정확히 알 수있을만큼 충분히 배울 때 좋을 것입니다. 아마도 eval과 관련이있을 것입니다.

defmodule Example do
  require Integer

  def do_it(list) do
    list
    |> Enum.reject(&Integer.is_odd(&1))
    |> Enum.map(&(:math.pow(&1,3)))
  end

end

참고 URL : https://stackoverflow.com/questions/32024156/how-do-i-raise-a-number-to-a-power-in-elixir

반응형