elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con recursividad
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con recursividad  (Leído 2,674 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Ayuda con recursividad
« 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. }

 ;-)


« Última modificación: 16 Septiembre 2018, 01:39 am por #!drvy » En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda con recursividad
« Respuesta #1 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.


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #2 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".
« Última modificación: 16 Septiembre 2018, 01:39 am por #!drvy » En línea

7w7
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ayuda con recursividad
« Respuesta #3 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.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda con recursividad
« Respuesta #4 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.
En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #5 en: 2 Septiembre 2018, 22:07 pm »

La profe dijo que ya esta bien, igual gracias
En línea

7w7
Elias Flores

Desconectado Desconectado

Mensajes: 13



Ver Perfil
Re: Ayuda con recursividad
« Respuesta #6 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.
« Última modificación: 16 Septiembre 2018, 01:39 am por #!drvy » En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #7 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. }
« Última modificación: 13 Septiembre 2018, 01:34 am por Beginner Web » En línea

7w7
Elias Flores

Desconectado Desconectado

Mensajes: 13



Ver Perfil
Re: Ayuda con recursividad
« Respuesta #8 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
En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Ayuda con recursividad
« Respuesta #9 en: 16 Septiembre 2018, 16:35 pm »

Que bueno, yo recien acabo de empezar el secundario primer año
En línea

7w7
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con recursividad
.NET (C#, VB.NET, ASP)
eagle17 2 3,284 Último mensaje 1 Marzo 2009, 10:29 am
por bitarray
ayuda recursividad
.NET (C#, VB.NET, ASP)
Choclito 2 2,723 Último mensaje 14 Mayo 2009, 03:38 am
por Choclito
Ayuda con Recursividad
.NET (C#, VB.NET, ASP)
40 3 2,446 Último mensaje 14 Septiembre 2015, 18:19 pm
por DarK_FirefoX
Ayuda recursividad « 1 2 »
Programación C/C++
JUHC 10 9,703 Último mensaje 8 Agosto 2016, 16:41 pm
por AlbertoBSD
AYUDA CON RECURSIVIDAD « 1 2 »
Programación C/C++
alpachino98 11 5,087 Último mensaje 7 Febrero 2018, 15:08 pm
por dijsktra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines