| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
hongee
Registrado: 16 Nov 2013 Mensajes: 27
| Publicado: 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: 27
| Publicado: 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: 27
| Publicado: 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: 27
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |