Compartir entrada

viernes, 17 de mayo de 2013

Sucesión de Fibonacci en C


Uno de los ejercicios típicos que se plantean a la hora de aprender a programar en cualquier lenguaje es realizar un algoritmo que muestre la sucesión de Fibonacci (o serie de Fibonacci).


Fórmulas matemáticas
Foto tomada de freedigitalphotos.net

La sucesión de Fibonacci es una sucesión infinita de números en los que cada uno de ellos es el resultado de la suma de sus dos inmediatamente anteriores. La sucesión comienza tal que así:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987...

Por definición matemática la sucesión de Fibonacci es una sucesión recurrente, es decir, se necesita que se calculen términos anteriores bajo la misma definición para poder calcular uno de sus números. Es por esto por lo que la implantación de la serie en cualquier lenguaje de programación se podría considerar un clásico en los temas de bucles y recursividad.

Como parte práctica del curso básico de C y como complemento al último ejercicio planteado en la serie de 25 ejercicios sobre estructuras iterativas, voy a facilitar el código de dos programas que muestran los primeros 20 dígitos de la sucesión de Fibonacci, el primero será usando un bucle For y el segundo será mediante el uso de la recursividad.

Veamos cómo sería la sucesión de Fibonacci en C utilizando bucles:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int x,y,z,cont;

  x=0;
  y=1;
 
  printf("0\n1\n",z);
 
  for (cont=1;cont<=20;cont=cont+1)
  {
      z=x+y;
      printf("%d\n",z);
      x=y;
      y=z;
  }
 
  system("PAUSE");     
  return 0;
}

Ahora la sucesión de Fibonacci en C utilizando funciones recursivas:

#include <stdio.h>
#include <stdlib.h>

int fibonacci(int n)
{
  if (n>2)
    return fibonacci(n-1) + fibonacci(n-2);
  else if (n==2)
    return 1;
  else if (n==1)       
    return 1;
  else if (n==0)
    return 0;
}

int main(void)
{
    int num;

    for (num=0; num<=20; num++)
    {
      printf("%d\n", fibonacci(num));
    }
 
  system("PAUSE");     
  return 0;
}

¿Qué otras formas conoces de calcular la sucesión de Fibonacci?

12 comentarios:

  1. Aquí desarrolle otra forma de calcular la suceción de fibonacci utilizando un arreglo unidimensional

    #include
    #include

    int fibonacci(int n)
    {
    if (n <= 0)
    {
    return 0;
    }
    else
    {
    int array[100]={0};
    array[1] = 1;
    array[2] = 1;
    for(int i=3; i <= n; i++)
    {
    //se aplica el procedimiento de la sucesion de fibonacci
    array[i] = array[i-1] + array[i-2];

    }

    return array[n];
    }

    }

    main()
    {
    int n =0, r=0;

    printf("\n Ingrese una posicion de la sucesion de fibonacci\n");
    scanf("%i", &n);

    r = fibonacci(n);

    printf("\n El termino %i de la sucesion de fibonacci es %i\n",n,r);
    system("pause");


    }

    ResponderEliminar
  2. Aquí desarrolle otra forma de calcular la suceción de fibonacci utilizando un arreglo unidimensional

    #include
    #include

    int fibonacci(int n)
    {
    if (n <= 0)
    {
    return 0;
    }
    else
    {
    int array[100]={0};
    array[1] = 1;
    array[2] = 1;
    for(int i=3; i <= n; i++)
    {
    //se aplica el procedimiento de la sucesion de fibonacci
    array[i] = array[i-1] + array[i-2];

    }

    return array[n];
    }

    }

    main()
    {
    int n =0, r=0;

    printf("\n Ingrese una posicion de la sucesion de fibonacci\n");
    scanf("%i", &n);

    r = fibonacci(n);

    printf("\n El termino %i de la sucesion de fibonacci es %i\n",n,r);
    system("pause");


    }

    ResponderEliminar
    Respuestas
    1. Estupendo Jorge, en cuanto pueda lo testeo, muchas gracias por la aportación.

      Saludos.

      Eliminar
  3. Muchas gracias, por el curso, muy útil y muy bien desarrollado.

    Aquí va otra opción:

    int fibonacci (int n)
    {
    switch (n) {
    case 2:
    return 1;
    case 1:
    return 1;
    case 0:
    return 0;
    default:
    return fibonacci(n - 1) + fibonacci(n - 2);
    }
    }

    int main (void)
    {
    int num;

    for (num = 1;num <= 20; num++) {
    printf("%d\n", fibonacci(num));
    }

    system("PAUSE");
    return 0;
    }

    ResponderEliminar
  4. aqui con un array simple, este codigo integra el calculo tambien del factorial y otras cosas...

    #include
    #include

    int serie[100];
    int x=0,y=0,i=0,j=0,k=0,elements=0;
    float prom=0;

    void main(){
    do{
    printf("programa que calucula una serie de numero (factorial o fibonacci)\n\n");
    printf("calcula el promedio de n numeros de la serie\n\n");
    printf("elija la serie a calcular y digite el numero de elementos menor que 100\n\n");
    printf("1. factorial\n\n");
    printf("2. fibonacci\n\n");
    printf("3. salir\n\n");
    scanf("%d",&x);
    //calcula factorial
    if (x==1){
    printf("ahora el total de elementos del array\n\n");
    scanf("%d",&y);
    j=1;
    for(i=1; i<=y; ++i){
    printf("\n");
    j=j*i;
    serie[i-1]=j;
    printf("[%d]",serie[i-1]);
    }
    printf("cuantos elementos del array quiere calcular, su array tiene %d elementos\n\n",y);
    scanf("%d",&elements);
    for(i=0; i<=elements; ++i){
    k=(serie[i]+k);
    }
    prom=k/elements;
    printf("Promedio de los primeros %d numeros = %f ",elements,prom);
    printf("\n\n\n");
    }
    //calcula fibonacci

    if(x==2){
    printf("ahora el total de elementos del array\n\n");
    scanf("%d",&y);
    j=1;
    serie[0]=1;
    serie[1]=1;
    for(i=2; i<y; ++i){
    serie[i]=serie[i-1]+serie[i-2];
    }
    for(i=0; i<y; ++i){
    printf("\n");
    printf("[%d]",serie[i]);
    }
    printf("cuantos elementos del array quiere calcular, su array tiene %d elementos\n\n",y);
    scanf("%d",&elements);
    for(i=0; i<elements; ++i){
    k=(serie[i]+k);
    }
    prom=k/elements;
    printf("Promedio de los primeros %d numeros = %f ",elements,prom);
    printf("\n\n\n");
    }
    }
    while(x!=3);
    }

    ResponderEliminar
  5. me pueden explicar la parte de return fibonacci(n-1) + fibonacci(n-2);
    ¿de qué manera opera ese parámetro?

    ResponderEliminar
  6. aqui va uno de 12 lineas de codigo, mi correo por si tienen dudas: manuel_10000@hotmail.com

    #include
    int main()
    {
    int num0 = 0, num1 = 1, hasta = 10000;
    while(num1 < hasta) {
    num0 = num1 + num0;
    num1 = num0 + num1;
    printf("\n%d", num0 );
    printf("\n%d", num1 );
    }
    return 0;
    }

    ResponderEliminar
    Respuestas
    1. colo include si librerias? es imposible eso no corre

      Eliminar
    2. pero quisiera que me pida poner un numero y de ese numero sacar la serie hasta esenumero por fibonacii

      Eliminar
    3. podrias poner algo asi.....

      public static void main(String[] args) {
      int num;
      Scanner enter = new Scanner(System.in);
      System.out.print("numero:\n");
      num=enter.nextInt();


      for(int i=0;i<num;i++){
      System.out.printf("%d\n",SusecionFib(i));
      }
      // TODO Auto-generated method stub

      }

      }

      Eliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar

 
Google+