Tengo dificultades para seguir esta función. No entiendo cómo la variable start
revierte a 16 después de que alcance un valor de 26, que es mayor que 24.Explicar esta función de JavaScript de Eloquent Javascript
function findSequence(goal) {
function find(start, history) {
if (start == goal)
return history;
else if (start > goal)
return null;
else
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
print(findSequence(24));
bien, después de mirar esto por algún tiempo, tengo un par de preguntas que podría aclarar un algunas cosas:
1) ¿Es una afirmación correcta decir que cada llamada a buscar realiza un seguimiento de su propio valor de inicio? Por ejemplo, cuando se llama a find (1), tiene un valor de inicio de 1, cuando se llama a find (1 + 5), el valor de inicio de find (1) sigue siendo uno, pero find (1 + 5) ahora tiene es su propio valor inicial de 6.
2) Me está costando mucho seguir la pila, incluso si la veo impresa. Esta es la forma en que estoy viendo que:
find (1) llama a encontrar (1 + 5) = 1 // Iniciar
find (6) llamadas a encontrar (6 + 5) // start = 6, pases
find (11) se encuentran las llamadas (11 + 5) // start = 11, pasa
find (16) llamadas a encontrar (16 + 5) // start = 16, pasa
find (21) llamadas find (21 + 5) // start = 21, Fails
Beca use find (21 + 5) devuelve null, intenta llamar a find (21 * 3) que también devuelve null.
Esta es la parte en la que me quedo atascado, si ambos encuentran (21 + 5) y encuentran (21 * 3) devuelven nulo, ¿cómo sabe llamar a find (16 * 3) después? ¿Por qué no encuentra (16 + 5) nuevamente?
Tiene algo que ver cuando find (21 + 5) y find (21 * 3) fueron llamados por find (16) y porque aquéllos devolvieron null a la función de llamada, ejecutó la segunda parte || declaración que fue encontrar (16 * 3).
¿No significan dos tubos "o"? ¿Cómo puedes devolver una cosa u otra? – ScottC
@ScottC: en Javascript, "O" '||' devuelve el primer elemento si es verdadero-ish, o el segundo elemento si el primer elemento es falso-ish (que incluye null). Es una generalización del booleano o se comporta de manera similar a un operador de coalescencia nula. – Jimmy
@ScottC: Lea el capítulo de su libro de Javascript sobre condiciones booleanas. Es lo mismo que 'var x = y || z; devolver x; '. –