Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 2 Septiembre 2018, 00:07 am



Título: Ayuda con recursividad
Publicado por: Beginner Web en 2 Septiembre 2018, 00:07 am
Hola, necesito una ayuda , non puedo sumar los valores de una lista enlazada simple la cual tiene un apuntador de inicio, dejo al estructura y la funcion recursiva que logre hasta ahora

Código
  1. typedef struct tnodo *pnodo;
  2. typedef struct tnodo{
  3. int dato;
  4. pnodo sig;
  5. };
  6. typedef struct tlista{
  7. pnodo inicio;
  8. };

Código
  1. int sumar(tlista lista)
  2. {
  3. pnodo i;
  4. if(lista.inicio==NULL){
  5. return 0;
  6. }
  7. else{
  8. return lista.inicio->dato+sumar(i=i->sig);
  9. }
  10. }

 ;-)


Título: Re: Ayuda con recursividad
Publicado por: MAFUS en 2 Septiembre 2018, 00:59 am
Directamente no se puede hacer: tlista solo tiene un miembro que apunta a un pnodo, por tanto desde un tlista pasado como argumento no se puede ir al siguiente. Se me ocurre que con algo de trabajo y variables static podría ser, pero es hacer un código muy feo.

Lo mejor sería hacer algo así:
Código
  1. static int sumar_interno(pnodo nodo) {
  2.    if(!nodo)
  3.        return 0;
  4.    else
  5.        return nodo->dato + sumar_interno(nodo->sig);
  6. }
  7.  
  8. int sumar(tlista *lista) {
  9.    if(!lista)
  10.        return 0;
  11.    else
  12.        return sumar_interno(lista->inicio);
  13. }

Esto haría que la interfaz fuera sumar, pero ésta llamaría a sumar_interno quien haría realmente todo el trabajo; y esta sí puede iterar sobre sí misma pues un pnodo sí forma realmente la lista.


Título: Re: Ayuda con recursividad
Publicado por: Beginner Web en 2 Septiembre 2018, 11:49 am
Habian explicado en clase una forma que era ir disminuyendo el tamaño de la lista y sumando cada dato a otra variable de tipo int suma todo con una sola funcion/procedimiento pero no me acuerdo solo tengo eso



Lo acabo de solucionar era que necesitaba el nodo cabeza que esta en la estructura lista "pnodo inicio", ahi va el codigo completo  ;-)

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11. typedef struct tlista{
  12. pnodo inicio;
  13. };
  14.  
  15. void inicia(tlista &lista);
  16. void crear(pnodo &nuevo);
  17. void agregar_final(tlista &lista, pnodo nuevo);
  18. int sumar_nodos(pnodo inicio);
  19. void mostrar(tlista lista);
  20.  
  21. int main()
  22. {
  23. tlista milista;
  24. pnodo nodo;
  25. int opcion, suma=0;
  26. inicia(milista);
  27. do{
  28. system("cls");
  29. cout << "1. Iniciar lista" << endl;
  30. cout << "2. Agregar elementos a la lista" << endl;
  31. cout << "3. Sumar elementos" << endl;
  32. cout << "4. Mostrar lista" << endl;
  33. cout << "5. Salir" << endl;
  34. cin >> opcion;
  35. switch(opcion){
  36. case 1: inicia(milista); break;
  37. case 2: crear(nodo); if(nodo!=NULL){agregar_final(milista,nodo);}; break;
  38. case 3: suma=sumar_nodos(milista.inicio); cout << "SUMA: " << suma << endl; break;
  39. case 4: cout << "***LISTA***" << endl; mostrar(milista); break;
  40. case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
  41. default: cout << "Opcion incorrecta" << endl;
  42. }
  43. system("pause");
  44. }while(opcion!=5);
  45. }
  46.  
  47. void inicia(tlista &lista)
  48. {
  49. lista.inicio=NULL;
  50. }
  51.  
  52. void crear(pnodo &nuevo)
  53. {
  54. nuevo=new tnodo;
  55. if(nuevo!=NULL){
  56. cout << "Ingrese valor: "; cin >> nuevo->dato;
  57. nuevo->sig=NULL;
  58. }
  59. else{
  60. cout << "MEMORIA INSUFICIENTE" << endl;
  61. }
  62. }
  63.  
  64. void agregar_final(tlista &lista, pnodo nuevo)
  65. {
  66. pnodo i;
  67. if(lista.inicio==NULL){
  68. lista.inicio=nuevo;
  69. }
  70. else{
  71. for(i=lista.inicio;i->sig!=NULL;i=i->sig);
  72. i->sig=nuevo;
  73. }
  74. }
  75.  
  76. int sumar_nodos(pnodo inicio)
  77. {
  78. if(inicio==NULL){
  79. return 0;
  80. }
  81. else{
  82. return inicio->dato+sumar_nodos(inicio->sig);
  83. }
  84. }
  85.  
  86. void mostrar(tlista lista)
  87. {
  88. pnodo i;
  89. if(lista.inicio!=NULL){
  90. for(i=lista.inicio;i!=NULL;i=i->sig){
  91. cout << "Nodo: " << i->dato << endl;
  92. }
  93. cout << endl;
  94. }
  95. else{
  96. cout << "LISTA VACIA" << endl;
  97. }
  98. }
  99.  
::) ::) ::)
 ;-) ;-) ;-)


Mod: Prohibido el doble o triple post. Usa el botón "Modificar".


Título: Re: Ayuda con recursividad
Publicado por: CalgaryCorpus en 2 Septiembre 2018, 16:30 pm
2 ideas para optimizar lo que ya tienes:

Si guardas la suma total en la struct lista y la actualizas cada vez que insertas un elemento, no necesitas iterar o hacer recursion.

Si guardas un puntero al ultimo nodo y lo actualizas cada vez que insertas al final, no necesitas iterar hasta el final cada vez que insertas.


Título: Re: Ayuda con recursividad
Publicado por: MAFUS en 2 Septiembre 2018, 17:50 pm
Y si el ejercicio se hace con una pila en vez de una lista se hace casi todo de forma automática.


Título: Re: Ayuda con recursividad
Publicado por: Beginner Web en 2 Septiembre 2018, 22:07 pm
La profe dijo que ya esta bien, igual gracias


Título: Re: Ayuda con recursividad
Publicado por: Elias Flores en 12 Septiembre 2018, 23:32 pm
Tengo una funcion que suma los elementos de un vector recursion en su estado mas puro espero te sirva saludos!

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <conio.h>
  4. #include <ctime>
  5. using namespace std;
  6. void cargar (int arreglo[],int n);
  7. void mostrar (int arreglo[],int num2,int n);
  8. int sumavector (int num1,int arreglo[],int num2,int n);
  9. int main (){
  10. int n,suma;
  11. cout<<"ingrese la longitud del vector: ";cin>>n;
  12. int arreglo[n];
  13. cargar (arreglo,n);
  14. mostrar (arreglo,0,n);
  15. suma =sumavector(0,arreglo,0,n);
  16. cout<<"\nla suma es: "<<suma<<endl;
  17. getch();
  18. return 0;
  19. }
  20. int sumavector (int num1,int arreglo[],int num2,int n){
  21. if (n==num2){//caso base elemental mi querdo watson :D
  22. return num1;
  23. }else{
  24. num1=num1+arreglo[num2];
  25. return sumavector(num1,arreglo,num2+1,n);}
  26. }
  27. void cargar (int arreglo[],int n){//en el siguiente metodo le pasado el vector y el indice que comienza en cero = num2
  28. if (n>0){   //num2 debe ir aumentando de 1 en 1
  29. srand(time(0));   //el srand sirve para sincronizar el rand con el reloj del pc
  30. cargar(arreglo,n-1);   //llamamos a la misma funcion cargar pero menos el ultimo dato n-1
  31. arreglo[num2]=1+rand()% 10;}
  32. }
  33. void mostrar (int arreglo[],int num2,int n){
  34. if (n>0){
  35. mostrar(arreglo,num2+1,n-1);
  36. cout<<arreglo[num2]<<" ";}
  37. }


Mod: Obligatorio el uso de etiquetas GeSHi para códigos.


Título: Re: Ayuda con recursividad
Publicado por: Beginner Web en 13 Septiembre 2018, 01:25 am
Hola Elias, que bien que curso estas haciendo? interesante tu funcion

Yo haria algo asi con sumar recursivamente un arreglo de enteros, donde n es el tamaño maximo del arreglo

Código
  1. int sumar(arreglo a, int n)
  2. {
  3. if(n==-1)
  4. return 0;
  5. else
  6. return a[n]+sumar(a,n-1);
  7. }


Título: Re: Ayuda con recursividad
Publicado por: Elias Flores en 16 Septiembre 2018, 02:39 am
Estoy en la "U" 3 semestre  :D recien comenzando, todo lo que avanzo de programacion y logica lo subo al foro para poder orientarme mas adelante si olvido algo, ademas es mi aporte a la comunidad EL CONOCIMIENTO ES LIBRE PARA TODOS


Título: Re: Ayuda con recursividad
Publicado por: Beginner Web en 16 Septiembre 2018, 16:35 pm
Que bueno, yo recien acabo de empezar el secundario primer año