El truco para entender la recursividad es la comprensión de la apilar.
Estoy en la línea 2 en una función llamada main
, todos mis variables locales se almacenan en mi marco de pila:
+------------------+
| main() variables | The stack frame
+------------------+
entonces yo llamo fib(3)
, por lo que el equipo empuja mi posición actual (EIP) a la pila, luego crea un nuevo marco de pila para fib y lo agrega también. Sólo puedo siempre tener acceso al marco de pila superior:
+------------------+
| fib() n = 5 | Top of stack (current frame)
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
En la línea 4 de fib
, llama fib
de nuevo, por lo que la misma vuelva a suceder:
+------------------+
| fib() n = 4 | Top of stack
+------------------+
| EIP: fib @ 4,1 |
+------------------+
| fib() n = 5 |
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
y lo hace una y otra vez como el la función se llama recursivamente. La pila crece hasta que algo retorna, en cuyo punto, en la línea 2 de fib
, devuelve 1.Esto hace aparecer el marco de la pila superior y la descarta, entonces regresa a la ejecución del puntero ejecución salvado y el programa continúa donde lo dejó
+------------------+
| fib() n = 3 | Top of stack
+------------------+
... etc ...
+------------------+
| EIP: main @ 2,1 |
+------------------+
| main() variables | Bottom of stack
+------------------+
Finalmente se termina de nuevo en la función que llama (o se obtiene un desbordamiento de pila ya que crece demasiado grande). La clave para recordar es que cada vez que se llama a la función, obtiene un nuevo marco de pila que contiene todas las variables locales, y se guarda su posición anterior. Eso es recursividad.
El principal problema es que al enseñar a la gente a recursividad, todos siempre usan la secuencia de Fibonacci, lo que significa que tienen dos llamadas a funciones recursivas en una línea. Esto es innecesariamente confuso, ¡estoy seguro de que estarás de acuerdo!
Si está pidiendo esto, que debe ser porque usted no comprende (a) la recursividad o (b) lo que es la serie Fibonacci. ¿Qué es? – CesarGon
http://www.google.com/search?q=recursion :-) – Anycorn
Entiendo cómo funciona el código y entiendo qué son los números de Fibonacci, también entiendo que la recursión está ocurriendo porque la función se está llamando a sí misma, simplemente puedo ' t averiguar por qué está funcionando. – Joseph