Powered by AppSignal & Oban Pro

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}.")