2010-11-03 13 views
7

Estoy repasando un libro de programación y uno de los ejemplos es acerca de los números de Fibonacci, y cómo una función recurrente encuentra el número de Fibonacci para el enésimo.números de fibonacci, ¿por qué funciona esta función recurrente?

El código es el siguiente:

Int fib (int n) 
{ 
If (n<3) 
Return (1); 
Else 
Return (fib(n-1))+(fib(n-2)) 
} 

Ahora bien, esto no es exacto, porque estoy escribiendo desde mi teléfono y tengo una comprensión de cómo el código está trabajando, se hace llamar hasta que vuelve 1, luego suma los valores de retorno hasta que tenga el número de Fibonacci correcto para la posición en la secuencia.

Así que no necesito ayuda con el código. Lo que sí necesito ayuda es entender por qué esto funciona. ¿Cómo da la respuesta correcta la suma de todas las devoluciones?

Por favor alguien puede explicar por qué esto está funcionando. Gracias. Me está volviendo loco.

+3

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

+0

http://www.google.com/search?q=recursion :-) – Anycorn

+0

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

Respuesta

4

Un número de Fibonacci se define como la suma de los dos números anteriores de Fibonacci. Eso le da lo siguiente:

1 1 2 3 5 8 13 ... 

Así que para la tercera serie (1 1) que tomaría el resultado de la búsqueda de la anterior - es decir, segundo (1 2) número y añadirlo a la serie antes del número anterior, es decir, 1er (1 2).

También debe comprender que el programa necesita calcular el valor de los dos números anteriores para poder calcular el número que desea saber. Por lo tanto, sigue llamándose a sí mismo, utilizando el mismo método, hasta que lo haya calculado todo.

+0

Todo el mundo realmente ayudó pero su explicación lo hizo clic. Cheers dude – Joseph

2

Un número de fibonacci se define como la suma de los dos números de Fibonacci anteriores. Cada uno se define como la suma de los dos números anteriores de Fibonacci. Etcétera, etcétera, hasta llegar a 1. ¿Entender? Cualquier número aleatorio de Fibonacci se puede definir como la suma de dos números de Fibonacci; se pueden definir recursivamente como la suma de dos números de Fibonacci, etc. Es decir, la definición de un número de Fibonacci es fundamentalmente recursiva; es decir, la definición de eso implica lo que define.

Esto puede ser complicado, pero es muy fundamental para entender la recursividad y la informática. Sigue trabajando en eso; hará clic eventualmente.

+0

¿Cómo es que hacemos n-1 + n-2? No estoy haciendo la conexión de cómo quitando 1 o 2 y repitiendo averigua el número correcto de Fibonacci. – Joseph

+0

@ Joseph, la definición de un número de fibonacci (n) es que es la suma de los dos números anteriores de fibonacci (n - 1, n - 2). No estás quitando 1 o 2 del número mismo; vas retrocediendo en la secuencia de números que componen los números de Fibonacci. Si su número de fibonacci (n) es 13, entonces el número de fibonacci (n-1) es 8, no 12. –

8

sugeriría a entender cómo funciona la recursividad. Básicamente FIB función se ejecuta en sí con un argumento más pequeño hasta el argumento se reduce a 2, entonces, sólo se devuelve 1.

fib(1) = 1 
fib(2) = 1 
fib(3) = fib(2) + fib(1) = 1 + 1 = 2 
fib(4) = fib(3) [ fib(2) + fib(1) = 1 + 1 = 2 ] + fib(2) = 2 + 1 
... 

Una manera de entender cómo funciona es para ejecutarlo en un depurador paso a paso.

+3

Los primeros dos números de Fibonacci en realidad son ambos 1 ... – peoro

+2

En realidad, el OP declaró que entiende bien la recursión. Simplemente no puede entender por qué la función recursiva puede generar números de Fibonacci. Supongo que el OP no entiende los números de Fibonacci o tiene una comprensión de "libro de texto" (es decir, si se le pregunta puede decir que es la suma de dos números de Fibonacci anteriores pero en realidad no entiende lo que realmente significa, por lo tanto no ve que lo que es realmente es recursión. Esto es suficiente para aprobar los exámenes, pero lamentablemente no es suficiente para aplicarlo en la vida real). – slebetman

12

La recursividad es así:

  1. Un niño no podía dormir, por lo que su madre le dijo una historia sobre una pequeña rana ,
  2. que no podía dormir, así madre de la rana le dijo una historia acerca de un pequeño oso ,
  3. que no podía dormir, por lo madre del oso le dijo una historia sobre una pequeña comadreja ...
  4. que se durmió.
  5. ..y el osito se durmió;
  6. ... y la pequeña rana se durmió;
  7. ... y el niño se durmió.

source

0

Por definición, los números de Fibonacci son la suma de los dos números anteriores en la serie (en la que los dos primeros son 0 y 1).

Por lo tanto, cuando obtiene el número de fibonacci en una ubicación, puede volver a escribirlo como la suma de los dos números anteriores de fibonacci.

Usando la recursividad, pasa por este proceso hasta que los "dos números de Fibonacci" sean previamente 1 y 1 (en el caso de este algoritmo), y luego continúe agregando los números juntos "respalde" la recursión hasta que vuelve a tu ubicación original en la secuencia.

4

Es la definición de números de Fibonacci.

n-th número de Fibonacci devuelve la suma de (n-1) th y (n-2) los números de Fibonacci.

Así que podemos demostrar, mediante el razonamiento inductivo, que si fib (n-1) y fib (n-2) dan el número de Fibonacci (n-1) y (n-2) -th válido, fib (n) = fib (n-1) + fib (n-2) será el n-ésimo número de Fibonacci válido.

El paso de base es que fib (1) y fib (2) son correctas (eso es todo FIB (1) = fib (2) = 1) ...

+0

¿Hay alguna manera más fácil de explicar esto? Este es el problema con el que me estoy estancando. Simplemente no puedo entenderlo – Joseph

+0

¿Qué no tienes claro? fib (n) IS fib (n-1) + fib (n-2) por definición. Eso significa que, el n-ésimo número de Fibonacci es (igual) la suma de los dos números anteriores de Fibonacci. - Es como decir: el n-ésimo número natural es (es igual a) el (n-1) -th + 1; el séptimo número natural (es decir: 7) es 6 + 1. Esta es la definición de los números naturales – peoro

3

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!

Cuestiones relacionadas