Imagínese he definido un factorial recursiva en Mathematica, así:En Mathematica, ¿por qué un reemplazo en una función recursiva no finaliza?
Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]
Evaluación de hecho [10] confirma que la función funciona y termina.
Un ejemplo básico, pero cumple su propósito en esta pregunta. En realidad, mi pregunta se refiere a las definiciones de funciones recursivas en general de todos modos.
que espera la evaluación de las sustituciones siguientes para terminar así:
x fact[x-1] /. x -> 2
Por desgracia, se ejecuta en un límite de nivel de recursividad:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.
esperaba ver algo como:
2 fact[2-1]
o simplemente el valor
2
ACTUALIZACIÓN: Una definición recursiva alternativa de hecho de hace funcionar según lo esperado:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]
Pero este hecho (nunca mejor dicho ;-) hace que sea aún más misterioso para mí: ¿Por qué lo hace comportarse de manera muy diferente?
Mi pregunta es doble:
Incluso con la ayuda integrada y buscando en la red en busca de pistas, no puedo explicar por qué insiste en Mathematica, al parecer, manteniendo el resultado simbólico, en lugar de evaluar los resultados 'intermedios' y que terminan muy bien. ¿Quién aventura una explicación viable?
¿Cómo puedo convencer a Mathematica para que funcione de acuerdo con mis expectativas (aparte de utilizar la alternativa con si [])?
Estoy realmente desconcertado por esta, y realmente espero que alguien pueda ayudarme.
/Twan
Aha, eso tiene sentido: Mathematica primero evalúa el LHS de /. y _then_ realiza el reemplazo.Y con Hold [] puede posponer esa evaluación 'ansiosa'. Gracias por la gran respuesta: eficaz, relevante, claro y conciso! Mis felicitaciones – nanitous
@nanitous ¡Salud! Si una de las tres respuestas responde su pregunta, puede marcarla como la respuesta aceptada para que aparezca en la parte superior (y le da un impulso de reputación al que responde). – acl
¡gracias por señalar eso! – nanitous