es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    (define (gcd-multi . lst)
      (cond
        ((null? lst) 0) ; si la lista de entrada está vacía, gcd es 0
        ((null? (cdr lst)) (car lst)) ; si la lista de entrada tiene solo un elemento, gcd es ese elemento
        (else (apply gcd (cons (car lst) (apply gcd-multi (cdr lst)))))
      )
    )
    

    Aquí, la función gcd-multi toma un número variable de argumentos, que se almacenan como una lista llamada lst 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 en gcd con el primer elemento de la lista de entrada (car lst) y el resultado de llamar a gcd-multi en el resto de la lista ((cdr lst)), usando la operación cons 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:

    (define (lcm-multi . lst)
      (cond
        ((null? lst) 0) ; si la lista de entrada está vacía, lcm es 0
        ((null? (cdr lst)) (car lst)) ; si la lista de entrada tiene solo un elemento, lcm es ese elemento
        (else (* (apply lcm (cons (car lst) (apply lcm-multi (cdr lst))))
                 (apply gcd (cons (car lst) (apply gcd-multi (cdr lst))))))
      )
    )
    

    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ón gcd-multi. Usamos la función apply para llamar a lcm y gcd 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.

Comments are closed.