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.