JavaScript - Recursividad

 
Vista:
sin imagen de perfil
Val: 4
Ha aumentado su posición en 19 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Recursividad

Publicado por edwin (2 intervenciones) el 29/04/2020 04:57:04
holaa, alguien podria ayudarme, me estoy iniciando en javascript, estudiando del libro de eloquent javascript, pero tengo una duda, el codigo es el sig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function findSolution(target) {
  function find(current, history) {
    if (current == target) {
      return history;
    } else if (current > target) {
      return null;
    } else {
      return find(current + 5, `(${history} + 5)`) ||
             find(current * 3, `(${history} * 3)`);
    }
  }
  return find(1, "1");
}
 
console.log(findSolution(24));
// → (((1 * 3) + 5) * 3)


se supone que lo que hace la funcion es encontrar para un numero dado, cual seria la operacion sumando 5 y multiplicando por 3 que de ese numero, por ejemplo para el caso de 24, la respuesta seria '(((1 * 3) + 5) * 3)', esta es la cadena que devuelve finalmente la funcion, en el libro hay un diagrama que trata de explicar como funciona para el numero 13, es el siguiente

1
2
3
4
5
6
7
8
9
10
11
12
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!

entiendo hasta antes de llegar a 18, lo ultimo que hace es que cuando llega a find con 16 y despues con 32, deberia retornar null || null, pero no entiendo de donde sale ese 18, aiudaaa. gracias :3
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de aberon10
Val: 477
Bronce
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Recursividad

Publicado por aberon10 (130 intervenciones) el 30/04/2020 03:01:18
Hola Edwin, estos son temas que tiene que ver como trabaja la recursividad y el call stack en javascript.
Tomando como ejemplo el ejercicio anterior, cuando el valor es 16, al llamar a find esta retorna null por lo que va a continuar la ejecución desde donde fue llamada, es decir, que evalúa el segundo operando del condicional en este caso
1
find(current * 3, `(${history} * 3)`);
, como esta llamada retorna null, evalúa
1
null || null
lo cual es null, entonces continua desde donde fue llamada, donde su valor actual era en ese momento 6, por lo que al evaluar el condicional
1
find(current * 3, `(${history} * 3)`);
devuelve 18, lo cual al llamar nuevamente a la función retorna null, y esta a su vez retorna null, hasta retroceder en la pila (call stack) en el que el valor de current era 1, realizando las sucesivas llamadas a partir de
1
find(3, "(1 * 3)")
, hasta alcanzar el valor deseado.

https://developer.mozilla.org/en-US/docs/Glossary/Call_stack
https://www.campusmvp.es/recursos/post/Que-es-la-recursividad-o-recursion-Un-ejemplo-con-JavaScript.aspx
https://es.wikipedia.org/wiki/Pila_de_llamadas

Nos comentas en caso de dudas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 4
Ha aumentado su posición en 19 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Recursividad

Publicado por edwin (2 intervenciones) el 13/05/2020 05:26:44
Hola aberon10, ese mismo dia poco despues encontre la misma pregunta en un foro (suelo ser impaciente jajaja), asi pude entender, aun asi muchas gracias por responder, veras es algo complicado o al menos en un inicio pensar en algoritmos y codigo recursivo, aun tengo mucho por aprender y creo que socializar y compartir el conocimiento expande ese aprendizaje, espero tener mas dudas y asi ir avanzando y mejorando en JavasCript, muchas Gracias por tu ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar