tag sobre responder preguntas para lista hombre hacer ejemplos cosas con amigos recursion sicp

recursion - sobre - tags para hacer con amigos



¿Cuál es la explicación para el ejercicio 1.6 en el SICP? (3)

En primer lugar, debe comprender la diferencia entre la evaluación del pedido aplicativo y el orden normal. Lisp utiliza un orden de aplicación, pero las expresiones condicionales se evalúan no como las funciones normales ( capítulo 1.1.6 de sicp ):

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

Para evaluar una expresión if, el intérprete comienza por evaluar la parte <predicate> de la expresión. Si el <predicate> evalúa a un valor verdadero, el intérprete luego evalúa el <consequent> y devuelve su valor. De lo contrario, evalúa <alternative> y devuelve su valor.

Estoy empezando a trabajar a través del SICP (por mi cuenta, esto no es para una clase), y he estado luchando con el ejercicio 1.6 durante un par de días y parece que no puedo entenderlo. Este es el único en el que Alyssa redefine if en términos de cond , así:

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

Lo prueba con éxito en algunos casos simples, y luego lo usa para volver a escribir el programa de raíz cuadrada (que funcionó bien con if ):

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

La pregunta entonces pregunta: "¿Qué sucede cuando Alyssa intenta usar esto para calcular raíces cuadradas? Explique". [Si es necesario, me complace reproducir los otros procedimientos (¿ good-enough? improve , etc.), solo házmelo saber].

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


new-if es un procedimiento, y Scheme usa evaluación de orden aplicativa (1.1.5), por lo que incluso antes de que new-if se realice realmente, primero tiene que evaluar todos los argumentos, que son guess y (sqrt-iter (improve guess x) x) . Puede ver que el último argumento es una recursión, que llama a un nuevo procedimiento new-if , así es como ocurre el ciclo infinito.

Lo ordinario if no if necesario evaluar sus argumentos primero, solo sigue el camino, esta es la diferencia entre if y new-if . :)


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