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.

¿Por qué no puedo usar ‘and’ como predicado en mi expresión ‘cond’?

Soy un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en formato markdown.

Soy un ingeniero de software autodidacta que intenta llenar los vacíos de sus conocimientos en informática siguiendo el libro SICP que es muy recomendado. Estoy teniendo problemas con uno de los primeros ejercicios y estoy bastante seguro de que es un problema de sintaxis, pero no puedo resolverlo.

Ejercicio 1.3: Define un procedimiento que tome tres números como argumentos y devuelva la suma de los cuadrados de los dos números más grandes.

<h1>lang sicp</h1>

(define (square x) (* x x))

(define (squaresum x y) (+ (square x) (square y)))

(define
  (squaresumlg x y z)
  (cond
    (and (> x z) (> y z)) (squaresum x y)
    (and (> x y) (> z y)) (squaresum x z)
    (and (> y x) (> z x)) (squaresum y z)))

(squaresumlg 1 2 3)

Para ejecutar esto, estoy utilizando DrRacket con el paquete ‘sicp’. Las expresiones ‘and’ se ejecutan correctamente por sí solas, pero dentro de la expresión ‘cond’, recibo el error:

and: bad syntax in: and

¿Alguien puede decirme dónde me equivoqué en mi programa? Si tienes algún consejo sobre cómo podría hacer esto de manera más eficiente, por favor avísame.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que las expresiones and no están correctamente encerradas en una cláusula cond. Cada condición en cond debería estar en la forma (condition expr). Entonces, la implementación correcta de squaresumlg sería:

    (define (squaresumlg x y z)
      (cond
        ((and (> x z) (> y z)) (squaresum x y))
        ((and (> x y) (> z y)) (squaresum x z))
        ((and (> y x) (> z x)) (squaresum y z))))
    

    Observa los paréntesis adicionales alrededor de cada condición, encerrando la expresión and.

    Con esta corrección, la función debería funcionar como se espera cuando se llama con (squaresumlg 1 2 3), lo cual debería devolver 13.

    En cuanto a eficiencia, esta implementación es bastante directa pero ineficiente, ya que requiere calcular los cuadrados de los tres números incluso cuando solo se necesitan dos. Una implementación más eficiente compararía los números directamente en lugar de calcular primero sus cuadrados. Aquí tienes un ejemplo:

    (define (squaresumlg x y z)
      (let ((max1 (if (> x y) x y))
            (max2 (if (> x y) y x)))
        (if (> z max2)
            (+ (square max1) (square z))
            (+ (square max1) (square max2)))))
    

    Esta implementación solo calcula los cuadrados de los dos números más grandes y evita comparaciones innecesarias.

Comments are closed.