+ 1

Como funciona la recursion

ejemplo factorial del numero 3: int factorial(int n) { if (n==1) { return 1; } else { return n * factorial(n-1); } } ¿que sucede cuando la funcion llega al punto "if"? si n ==1 ¿por que retorna 6?, no entiendo como se mueve el codigo dentro de una recursion, ¿donde se almacenan los datos? ¿pensaba que cuando una funcion llegaba al return se cerraba? soy el tipo de persona que quiere entender como funciona todo de forma completa. Gracias de antemano.

21st Jun 2018, 3:04 AM
Link Skwor
Link Skwor - avatar
6 Respuestas
+ 5
Uhm... Vamos por partes. Primero que nada es una función recursiva, es decir, la función se llama a sí misma de forma indefinidad hasta alcanzar una condición, así que cuando tu función llega a return en este caso tiene un comportamiento diferente (llama nuevamente a la función, o retorna el valor que almacena en memoria) Pasemos a tu fragmento de código, a ver si puedo hacerlo más claro. El factorial de un número se define como la producto de todos los enteros menor a él, hasta llegar a uno. Es decir: 5! = 5*4*3*2*1 = 120 Ahora, llevemos esto a la práctica. En la primera llamada a tu función, todo estaría así: return 5 * factorial(5 - 1) En la segunda llamada estaría así: return 20 * factorial(4 - 1) ¿Por qué? Bueno, acá hay una parte que me cuesta explicar y que no creo poder explicar plenamente, pero haré lo mejor que pueda en este punto: el chiste es que sigues llamando la función en ese punto y modificando el valor del parametro para hacer otra llamada, mientras se mantiene el resultado anterior en memoria. Cuando n (el parametro que introduciste) es igual a 1 es cuando realmente se abandonará la función y retornará el resultado de la última llamada a la función, ya que es el caso base que define todo.
21st Jun 2018, 4:29 AM
Mickel
Mickel - avatar
+ 9
¿Sabe cómo hacer "handtracing"? :> int factorial(int n) { if (n==1) { return 1; } else { return n * factorial(n-1); } } Para factorial(3): factorial(3) 3 * factorial(2) 3 * (2 * factorial(1)) 3 * (2 * (1)) 6
21st Jun 2018, 4:49 AM
Hatsy Rei
Hatsy Rei - avatar
+ 7
Hatsy Rei ¿Trazar con la mano == gracias de antemano (thanks in advance)? lol
21st Jun 2018, 4:51 AM
Mickel
Mickel - avatar
+ 7
Mickel I thought it meant "handtracing" or at least "trace with your hand"? Darn it, Google!
21st Jun 2018, 4:53 AM
Hatsy Rei
Hatsy Rei - avatar
+ 4
Perdón si sueno complicado, pero aunque comprendo cómo funcionan las cosas eventualmente me es complicado expresarme de una manera clara, además, a veces me es complicado no mezclar conceptos
21st Jun 2018, 4:32 AM
Mickel
Mickel - avatar
+ 2
well, I was not expecting so many help. my english is not as good as I woud like. that is the reason why I asked in spanish. now I have a concept.
21st Jun 2018, 11:37 AM
Link Skwor
Link Skwor - avatar