/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

fibonacci recursivo (no es el clasico ejercicio)

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hongee



Registrado: 16 Nov 2013
Mensajes: 23

MensajePublicado: 27/02/2014 1:49 pm
Título: fibonacci recursivo (no es el clasico ejercicio)

Estimados, les paso el enunciado.
Hacer una función llamada fibmejorado que:
Calcule fibonacci de forma recursiva.
Dado el termino de fibonacci generar un nodo de una lista (el nodo se componía por: int termino, int numero, nodo sig) junto con el calculo del termino de la serie.
A modo de optimizacion, debía primero, cada vez que se ingresaba un termino, si este ya había sido calculado (osea, existía dentro de la lista) directamente mostrarlo y saltear el paso de calcularlo.
Ademas, hay que codificar un programa que pida esos términos, los corra por la función fibmejorado y que imprima esa lista al finalizar con -1-.

Lo que hice fue que la función principal se llame fibmejorado, y esta llame a otras ya que sino es mas complicado hacerlo y tener un orden me parece.

Código:

#include<stdio.h>
#include <stdlib.h>
#pragma warning (disable: 4996)

typedef struct snodo
{
   int termino; // numero de fib
   int numero; // secuencia de fib
   struct snodo *sig;
} tnodo;

typedef tnodo *tpuntero;

void insertar_ordenado(tpuntero *cabeza, int num, int res);
void fibmejorado(tpuntero *cabeza, int num);
int fib(int num);
int buscar (tpuntero *cabeza, int num);

int main()
{
   
   int num=0;

    printf("::NUMEROS DE FIBONACCI::\n");
    printf("Introduce el numero: ");
   scanf("%d",&num);
    while( num != -1 )
   {
      fibmejorado(num);
      printf("::NUMEROS DE FIBONACCI::\n");
      printf("Introduce el numero: ");
      scanf("%d", &num);
   }
   

   system("pause");
    return 0;
}

int buscar (tpuntero cabeza, int num)
{
   tpuntero aux;
   int encontrado=0;
   aux=*cabeza;

   if (aux->termino == num || aux !=NULL) // recorro la lista para buscar el valor
   {
      printf ("Termino:%d\n",aux->termino);
      printf ("Serie:%d",aux->numero);
      encontrado=1;
   }
   else
      aux=aux->sig;

   if (encontrado==1)
      return 1; // lo encontro
   else
      return 0; // no lo encontro

}
void fibmejorado(int num)
{
   tpuntero aux,aux2,cabeza;
   int encontrado,res;
   cabeza=NULL;
   encontrado=buscar(cabeza,num);// busco si esta el valor encontrado=1 existe valor
   if (encontrado==1)
   {   
      printf ("Termino:%d",aux->termino);
      printf ("Termino:%d",aux->numero);
   }
   else
   {
      res=fib(num);   
      insertar_ordenado(&cabeza, num, res);
   }
}
   
int fib (int num)
{
   if (num<2)
      return num;
   else
   return fib(num-1) + fib(num-2);
}
void insertar_ordenado(tpuntero *cabeza, int num, int res)
{
   tpuntero actual, anterior, nuevo;
   actual = *cabeza;
   anterior = NULL;

   while(actual != NULL && actual->termino < num )
   {
      anterior = actual;
      actual = actual->sig;
   }

   nuevo = malloc(sizeof(tnodo));
   nuevo->numero =res;
   nuevo->termino= num;
   nuevo->sig = actual;

   if(anterior != NULL)
      anterior->sig = nuevo;
   else
      *cabeza = nuevo;
   // imprimo el nuevo valor directamente
   printf ("Termino:%d",nuevo->termino);
   printf ("Termino:%d",nuevo->numero);
   
}



Los problemas que encontré hasta ahora son:
1) La funcion buscar no me compara la primera vez y esto es porque claramente esta vacia la lista. Como puedo hacerlo?
Código:

if (aux->termino == num || aux !=NULL)


2) Luego no se como guardar en numero el conjunto de los numero en res, esto es por ej. Numero de Fib=3 en tnodo->numero=0 1 1 2 -1.
El -1 tiene q estar al fina de la lista.


Muchas Gracias
Saludos
Volver arriba
hongee



Registrado: 16 Nov 2013
Mensajes: 23

MensajePublicado: 27/02/2014 2:07 pm
Título:

Ahi, lee el primer numero pero no me lo guarda en la lista.
Código:

#include<stdio.h>
#include <stdlib.h>
#pragma warning (disable: 4996)

typedef struct snodo
{
   int termino;
   int numero;
   struct snodo *sig;
} tnodo;

typedef tnodo *tpuntero;

void insertar_ordenado(tpuntero *cabeza, int num, int res);
void fibmejorado(tpuntero *cabeza,int num);
int fib(int num);
int buscar (tpuntero *cabeza, int num);

int main()
{   
   tpuntero cabeza;
    int num=0;
   cabeza=NULL;
    printf("::NUMEROS DE FIBONACCI::\n");
    printf("Introduce el numero: ");
   scanf("%d",&num);
    while( num != -1 )
   {
      fibmejorado(&cabeza,num);
      printf("::NUMEROS DE FIBONACCI::\n");
      printf("Introduce el numero: ");
      scanf("%d", &num);
   }
   

   system("pause");
    return 0;
}

int buscar (tpuntero *aux, int num)
{
   tpuntero aux2;
   int encontrado=0;
   aux2=*aux;
   if (aux2 ==NULL)
      encontrado=0;
   else
   {
      if (aux2->termino == num || aux2 !=NULL) // recorro la lista para buscar el valor
      {
         printf ("Termino:%d\n",aux2->termino);
         printf ("Serie:%d",aux2->numero);
         encontrado=1;
      }
      else
         aux2=aux2->sig;
   }

   if (encontrado==1)
      return 1; // lo encontro
   else
      return 0; // no lo encontro

}
void fibmejorado(tpuntero *cabeza,int num)
{
   tpuntero aux;
   int encontrado,res;
   aux=*cabeza;
   encontrado=buscar(&aux,num);// busco si esta el valor encontrado=1 existe valor
   if (encontrado==1)
   {   
      printf ("Termino:%d\n",aux->termino);
      printf ("Termino:%d\n",aux->numero);
   }
   else
   {
      res=fib(num);   
      insertar_ordenado(&aux, num, res);
   }
}
   
int fib (int num)
{
   if (num<2)
      return num;
   else
   return fib(num-1) + fib(num-2);
}
void insertar_ordenado(tpuntero *cabeza, int num, int res)
{
   tpuntero actual, anterior, nuevo;
   actual = *cabeza;
   anterior = NULL;

   while(actual != NULL && actual->termino < num )
   {
      anterior = actual;
      actual = actual->sig;
   }

   nuevo = malloc(sizeof(tnodo));
   nuevo->numero =res;
   nuevo->termino= num;
   nuevo->sig = actual;

   if(anterior != NULL)
      anterior->sig = nuevo;
   else
      *cabeza = nuevo;
   // imprimo el nuevo valor directamente
   printf ("#####################################");
   printf ("Termino:%d\n",nuevo->termino);
   printf ("Numeros de Fib:%d\n",nuevo->numero);
   
}

Volver arriba
hongee



Registrado: 16 Nov 2013
Mensajes: 23

MensajePublicado: 27/02/2014 2:46 pm
Título:

Ahi guarda todos los números y los imprime si son nuevo o los encontró. Guardo la secuencia pero no se como poner el -1 del final. S
i ingreso el valor 8 el valor lo pasa mal a enteros esto es porque pontencia tiene solo 5 indices :S
No puedo usar funciones estandar como atoi.
Si ustedes creen q el enunciado esta mal interpretado, por favor avísenme (me refiero a las funciones).

Código:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#pragma warning (disable: 4996)

typedef struct snodo
{
   int termino;
   int numero;
   struct snodo *sig;
} tnodo;

typedef tnodo *tpuntero;

void insertar_ordenado(tpuntero *cabeza, int num, int resf);
void fibmejorado(tpuntero *cabeza,int num);
int fib(int num);
int buscar (tpuntero *cabeza, int num);

int convertir_entero(char res[]); // obtenemos el numero
int longitud(char res[]) ;
int pot (int num);
int main()
{   
   tpuntero cabeza;
    int num;
   cabeza=NULL;
    printf("::NUMEROS DE FIBONACCI::\n");
    printf("Introduce el numero >= 0: ");
   scanf("%d",&num);
   fflush (stdin);
    while( num != -1 )
   {
      fibmejorado(&cabeza,num);
      printf("\n::NUMEROS DE FIBONACCI::\n");
      printf("Introduce el numero >=0: ");
      scanf("%d", &num);
      fflush (stdin);
   }
   
   system("pause");
    return 0;
}

int buscar (tpuntero *cabeza, int num)
{
   int encontrado=0;
   if (*cabeza ==NULL)
      encontrado=0;
   else
   {
      while (encontrado!=1 && *cabeza!=NULL)
      {
         if ((*cabeza)->termino == num) // recorro la lista para buscar el valor
         {
            encontrado=1;
            printf ("Termino (encontrado):%d\n",(*cabeza)->termino);
            printf ("Numero (encontrado):%d-1\n",(*cabeza)->numero);
         }
         else
         {
            cabeza = &(*cabeza)->sig;
         }
      }
   }

   if (encontrado==1)
      return 1; // lo encontro
   else
      return 0; // no lo encontro

}
void fibmejorado(tpuntero *cabeza,int num)
{
   int encontrado,resf=0,i;
   char res[999];
   encontrado=buscar(cabeza,num);// busco si esta el valor encontrado=1 existe valor
   if (encontrado!=1)
   {   
      for( i=0;i<=num;i++)
      {
         res[i]=fib(i);
      }
      res[i]=-1;
      resf=convertir_entero(res);
      insertar_ordenado(cabeza, num, resf);
   }
}
int convertir_entero(char res[])
{
   int i;
   int valor = 0;
   int lon;
 
   lon=longitud(res);
   for(i=lon-1; i>=0; i--)
      valor += ((int)res[i] * pot(i));

   return valor;
}   

int pot (int num)
{
   int i = 0;
   int pot = 1;

   while( i < num )
   {
       pot = pot*10;
       i++;
   }
 return (pot);
}

int longitud(char res[])
{
   int i=0;
   while(res[i]!=-1)
      i++;

   return i;
}
int fib (int num)
{
   if (num<2)
      return num;
   else
   return fib(num-1) + fib(num-2);
}
void insertar_ordenado(tpuntero *cabeza, int num, int resf)
{
   char c;
   tpuntero actual, anterior, nuevo;
   actual = *cabeza;
   anterior = NULL;

   while(actual != NULL && actual->termino < num )
   {
      anterior = actual;
      actual = actual->sig;
   }

   nuevo = malloc(sizeof(tnodo));
   nuevo->numero =resf;
   nuevo->termino= num;
   nuevo->sig = actual;

   if(anterior != NULL)
      anterior->sig = nuevo;
   else
      *cabeza = nuevo;
   // imprimo el nuevo valor directamente
   printf ("#####################################\n");
   printf ("Quiere ver el termino inserdado (s/n):\n");
   scanf ("%c",&c);
   fflush(stdin);
   c=tolower(c);
   if (c=='s'){
   printf ("Termino (con insertar):%d\n",nuevo->termino);
   printf ("Numeros de Fib (con insertar):%d-1\n",nuevo->numero);
   }
}


Muchas Gracias
Volver arriba
hongee



Registrado: 16 Nov 2013
Mensajes: 23

MensajePublicado: 28/02/2014 6:04 pm
Título:

Bueno, he re leído tantas veces el ejercicio, que lo he interpretado de otra forma la cual creo q es la correcta.
Es correcta esta o la anterior interpretación?

Código:

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

#pragma warning (disable: 4996)

typedef struct snodo
{
   int termino;
   int numero;
   struct snodo *sig;
} tnodo;

typedef tnodo *tpuntero;

void insertar_ordenado(tpuntero *cabeza, int num, int resf);
void fibmejorado(tpuntero *cabeza,int num);
int fib(int num);
int buscar (tpuntero *cabeza, int num);
void imprimir (tpuntero cabeza);

int main()
{   
   tpuntero cabeza;
    int num;
   cabeza=NULL;
    printf("::NUMEROS DE FIBONACCI::\n");
    printf("Introduce el numero >= 0: ");
   scanf("%d",&num);
   fflush (stdin);
    while( num != -1 )
   {
      fibmejorado(&cabeza,num);
      printf("\n::NUMEROS DE FIBONACCI::\n");
      printf("Introduce el numero >=0: ");
      scanf("%d", &num);
      fflush (stdin);
   }
      
   printf("Lista generada:\n");
   imprimir (cabeza);
   system("pause");
    return 0;
}

int buscar (tpuntero *cabeza, int num)
{
   int encontrado=0;
   if (*cabeza ==NULL)
      encontrado=0;
   else
   {
      while (encontrado!=1 && *cabeza!=NULL)
      {
         if ((*cabeza)->termino == num) // recorro la lista para buscar el valor
         {
            encontrado=1;
            printf ("El termino %d de la serie es (encontrado):%d\n",(*cabeza)->termino,(*cabeza)->numero);
            
         }
         else
         {
            cabeza = &(*cabeza)->sig;
         }
      }
   }

   if (encontrado==1)
      return 1; // lo encontro
   else
      return 0; // no lo encontro

}

void fibmejorado(tpuntero *cabeza,int num)
{
   int encontrado,res=0,i;
   encontrado=buscar(cabeza,num);// busco si esta el valor encontrado=1 existe valor
   if (encontrado!=1)
   {   
      printf("Serie de Fibonnaci para el termino %d\n",num);
      for( i=0;i<=num;i++)
      {
         res=fib(i);
         printf(" %d -", res);
      }
      insertar_ordenado(cabeza, num, res);
   }
}

int fib (int num)
{
   if (num<2)
      return num;
   else
   return fib(num-1) + fib(num-2);
}

void insertar_ordenado(tpuntero *cabeza, int num, int resf)
{
   tpuntero actual, anterior, nuevo;
   actual = *cabeza;
   anterior = NULL;

   while(actual != NULL && actual->termino < num )
   {
      anterior = actual;
      actual = actual->sig;
   }

   nuevo = malloc(sizeof(tnodo));
   nuevo->numero =resf;
   nuevo->termino= num;
   nuevo->sig = actual;

   if(anterior != NULL)
      anterior->sig = nuevo;
   else
      *cabeza = nuevo;
}

void imprimir (tpuntero cabeza)
{
   while (cabeza !=NULL)
   {
      printf ("El termino %d de Fibonnaci es:%d\n",cabeza->termino,cabeza->numero);
      cabeza=cabeza->sig;
   }
}



Muchas gracias
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com