Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Cálculo del Máximo Común Divisor

mathematics.livemd

Cálculo del Máximo Común Divisor

Cálculo del Máximo Común Divisor de dos números

Vamos a definir una función recursiva para calcular el MCD de dos números utilizando el algorítmo de Euclides https://es.wikipedia.org/wiki/Máximo_común_divisor#Usando_el_algoritmo_de_euclides:

defmodule Fracciones do
  def maximo_comun_divisor(a, b) do
    resto = rem(a, b)

    if resto > 0 do
      maximo_comun_divisor(b, resto)
    else
      b
    end
  end
end

a = 42
b = 56
mcd = Fracciones.maximo_comun_divisor(a, b)
IO.puts("El MCD de #{a} y #{b} es #{mcd}")

A continuación vamos a añadir otra función para calcular el MCD de una lista de números.

defmodule Fracciones do
  def maximo_comun_divisor(a, b) do
    resto = rem(a, b)

    if resto > 0 do
      maximo_comun_divisor(b, resto)
    else
      b
    end
  end

  def maximo_comun_divisor([primero | resto]) do
    resto
    |> Enum.reduce(primero, fn a, b -> maximo_comun_divisor(a, b) end)
  end
end

cifras = [42, 56, 7]
mcd = Fracciones.maximo_comun_divisor(cifras)
IO.puts("El MCD de #{Enum.join(cifras, ", ")} es #{mcd}")

Por último vamos a refactorizar el código y dejar solo la función que calcula el MCD de una lista de números.

defmodule Mathematics do
  @moduledoc """
  A module for Maths operations.
  """

  @doc """
  Calculates de Greatest Common Divisor of a list of numbers using the Euclidean algorithm.

  ## Examples:

      iex> Mathematics.greatest_common_divisor([42, 56, 7])
      7

  """
  def greatest_common_divisor([first | rest]) do
    Enum.reduce(rest, first, fn a, b -> greatest_common_divisor(a, b) end)
  end

  defp greatest_common_divisor(a, 0), do: a
  defp greatest_common_divisor(a, b), do: greatest_common_divisor(b, rem(a, b))
end

numbers = [42, 56, 7]
gmd = Mathematics.greatest_common_divisor(numbers)
IO.puts("The Greatest Common Divisor of #{Enum.join(numbers, ", ")}, is #{gmd}.")