gcd y lcm con múltiples parámetros en Scheme, DrRacket
(define (mcd a b)
(if (= b 0)
a
(mcd b (remainder a b))))
Todos conocemos esta famosa función, y sé que si quiero un (mcd a b c) es (mcd a b c) = (mcd a (mcd b c)). Pero necesito ver el código que me muestre cómo implementar esa función general, porque no quiero escribir muchas definiciones diferentes de la función, solo necesito la que incluye parámetros infinitos. Las funciones reales de gcd y lcm de racket ya lo hacen, pero no sé cómo.
davy.ai
Para implementar la función general para encontrar el máximo común divisor (gcd) de cualquier número de entradas, podemos modificar la función
gcd
existente de la siguiente manera:Aquí, la función
gcd-multi
toma un número variable de argumentos, que se almacenan como una lista llamadalst
usando la notación.
.La función primero verifica si la lista de entrada está vacía, en cuyo caso el gcd es 0. Luego verifica si solo hay un elemento en la lista de entrada, en cuyo caso ese elemento es el gcd.
Si ninguno de estos casos se aplica, llamamos a la función
apply
engcd
con el primer elemento de la lista de entrada (car lst
) y el resultado de llamar agcd-multi
en el resto de la lista ((cdr lst)
), usando la operacióncons
para combinar las dos listas.Esto nos permite llamar recursivamente a
gcd
en pares de elementos hasta obtener el gcd de todas las entradas.De manera similar, podemos implementar una función para encontrar el mínimo común múltiplo (lcm) de cualquier número de entradas de la siguiente manera:
Aquí, usamos el hecho de que
lcm(a, b) = a*b/gcd(a, b)
y manejamos la lista de entrada de la misma manera que en la funcióngcd-multi
. Usamos la funciónapply
para llamar alcm
ygcd
recursivamente en pares de elementos en la lista de entrada para calcular el lcm de todas las entradas.En general, estas funciones nos permiten encontrar el gcd o lcm de cualquier número de entradas con una sola definición de función.