Pregunta

Me estoy empezando a trabajar a través de SICP (por mi cuenta, lo que no es para una clase), y he estado luchando con el ejercicio 1.6 para un par de días y me parece que no puede resolverlo fuera. Esta es en la que Alyssa re-define if en términos de cond, así:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))

Se pone a prueba con éxito en algunos casos sencillos, y luego lo utiliza para re-escribir el programa raíz cuadrada (que funcionaba bien con if):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))

La pregunta entonces se pregunta: "¿Qué pasa cuando Alyssa intenta usar esto para calcular raíces cuadradas Explicar?". [Si es necesario, estoy feliz de reproducir los otros procedimientos (good-enough?, improve, etc.), házmelo saber.]

Ahora, sé lo que sucede: nunca devuelve un valor, lo que significa que el programa recursivamente infinitamente. No puedo explicar por qué sucede esto. Lo que existe diferencia sutil entre if y new-if me está eludiendo. Cualquier y toda ayuda muy apreciada.

¿Fue útil?

Solución

new-if es una función. Cuando una función se llama, ¿qué es lo primero que se hace con el Esquema de la lista de argumentos? Evalúa todos los argumentos.

Otros consejos

new-if es un procedimiento, y el Esquema utiliza la evaluación de orden aplicativo (1.1.5), por lo que incluso antes de new-if se lleva a cabo en realidad, tiene que evaluar todos los argumentos primero, que son guess y (sqrt-iter (improve guess x) x). Se puede ver que este último argumento es una recursividad, que llama a un nuevo procedimiento new-if, así es como se produce el bucle infinito.

El if ordinaria no tiene que evaluar sus argumentos en primer lugar, sólo tiene que ir en el camino, esta es la diferencia entre if y new-if. :)

En primer lugar hay que entender la diferencia entre la evaluación fin aplicativo y el orden normal. Lisp utiliza fin aplicativo, pero expresiones condicionales se evalúan no como funciones normales ( SICP capítulo 1.1.6 ):

(if <predicate> <consequent> <alternative>)
  

Para evaluar una expresión if, el intérprete se inicia mediante la evaluación de la parte <predicate> de la expresión. Si el <predicate> se evalúa como un valor verdadero, entonces el intérprete evalúa la <consequent> y devuelve su valor. De lo contrario, se evalúa el <alternative> y devuelve su valor.

Ex1.6. nueva-si:

(define (new-if predicate then-clause else-clause)
     (cond (predicate then-clause)
                (else else-clause)))

Diferencia con las sentencias if ‘’: sentencias if evaluar uno por uno desde el predicado -> consecuente -> alternativa,

Sin embargo, el ‘nuevo-si’ tiene que evaluar todos los parámetros también conocido como argumentos el momento de su llamada (que significa 'cláusula else' es evaluado al comienzo !!),

y por lo tanto esto causa un bucle infinito cuando cualquiera de estos parámetros de llamada a sí mismos en un bucle iterativo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top