Recursión de Javascript de Eloquent Javascript

Así que esto es del Javascript Eloquent . Estoy tratando de descubrir cómo este código es realmente atravesado. Así que estamos tratando de encontrar una forma de alcanzar el número objective agregando 5 o multiplicando por 3, y comenzamos desde el número 1. Entonces, esencialmente, estamos tratando de encontrar una secuencia de tales adiciones y multiplicaciones que produzcan el objective ¿número? Por ejemplo, se puede llegar al número 13 multiplicando primero por 3 y luego agregando 5 dos veces, mientras que el número 15 no se puede alcanzar en absoluto.

Aquí está el fragmento de código:

function findSolution(target) { function find(start, history) { if (start == target) return history; else if (start > target) return null; else return find(start + 5, "(" + history + " + 5)") || find(start * 3, "(" + history + " * 3)"); } return find(1, "1"); } 

El resultado:

 console.log(findSolution(24));// → (((1 * 3) + 5) * 3) 

Aparentemente esto es lo que sucede cuando llamamos a findSolution(13) :

Para comprender mejor cómo esta función produce el efecto que estamos buscando, echemos un vistazo a todas las llamadas para encontrar que se realizan al buscar una solución para el número 13.

 find(1, "1") find(6, "(1 + 5)") find(11, "((1 + 5) + 5)") find(16, "(((1 + 5) + 5) + 5)") too big find(33, "(((1 + 5) + 5) * 3)") too big find(18, "((1 + 5) * 3)") too big find(3, "(1 * 3)") find(8, "((1 * 3) + 5)") find(13, "(((1 * 3) + 5) + 5)") found! 

Pregunta:
1) Estoy confundido, lo que sucede cuando llamamos a findSolution (13). ¿Cómo es que la primera línea es find (1, “1”) cuando no le he proporcionado el número de inicio o de historia? ¿Cómo se reduce el código a la línea?

 return find(1,"1") 

¿Cómo llega el código allí?
2) ¿Es así como funcionan las instrucciones O en la recursión? En un chequeo recursivo, ¿JavaScript normalmente explora la primera twig de la statement OR antes de abordar la segunda twig? Es esta linea:

 find(3, "(1 * 3)") 

solo se verifica después de todas las twigs de:

 find(6, "(1 + 5)") 

no puede devolver una solución?

1) Si observa el código, la función “findSolution” se compone de dos partes: una definición de método “find” y una llamada a ese método “return find (1,” 1 “)”. La definición, en sí misma, no producirá computación a menos que se llame. Entonces, la primera expresión que se ejecuta realmente es “find (1,” 1 “)”. Es el punto de partida.

2) Las sentencias OR se ejecutan en su orden de lectura, por lo que “find (start + 5, …)” se ejecutará primero, y solo si devuelve null (es decir, no ha encontrado la solución) el La siguiente statement “find (start * 3, …)” se va a ejecutar. Debido a la recursión, puede tener cualquier número de “+5” de ejecución antes de ejecutar un “* 3”, dependiendo del objective, por supuesto.