Autor
|
Tema: Ayuda con recursividad (Leído 3,105 veces)
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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 typedef struct tnodo *pnodo; typedef struct tnodo{ int dato; pnodo sig; }; typedef struct tlista{ pnodo inicio; };
int sumar(tlista lista) { pnodo i; if(lista.inicio==NULL){ return 0; } else{ return lista.inicio->dato+sumar(i=i->sig); } }
|
|
« Última modificación: 16 Septiembre 2018, 01:39 am por #!drvy »
|
En línea
|
7w7
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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í: static int sumar_interno(pnodo nodo) { if(!nodo) return 0; else return nodo->dato + sumar_interno(nodo->sig); } int sumar(tlista *lista) { if(!lista) return 0; else return sumar_interno(lista->inicio); }
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
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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 #include <iostream> #include <stdlib.h> using namespace std; typedef struct tnodo *pnodo; typedef struct tnodo{ int dato; pnodo sig; }; typedef struct tlista{ pnodo inicio; }; void inicia(tlista &lista); void crear(pnodo &nuevo); void agregar_final(tlista &lista, pnodo nuevo); int sumar_nodos(pnodo inicio); void mostrar(tlista lista); int main() { tlista milista; pnodo nodo; int opcion, suma=0; inicia(milista); do{ system("cls"); cout << "1. Iniciar lista" << endl; cout << "2. Agregar elementos a la lista" << endl; cout << "3. Sumar elementos" << endl; cout << "4. Mostrar lista" << endl; cout << "5. Salir" << endl; cin >> opcion; switch(opcion){ case 1: inicia(milista); break; case 2: crear(nodo); if(nodo!=NULL){agregar_final(milista,nodo);}; break; case 3: suma=sumar_nodos(milista.inicio); cout << "SUMA: " << suma << endl; break; case 4: cout << "***LISTA***" << endl; mostrar(milista); break; case 5: cout << "FIN DEL PROGRAMA" << endl; break; default: cout << "Opcion incorrecta" << endl; } system("pause"); }while(opcion!=5); } void inicia(tlista &lista) { lista.inicio=NULL; } void crear(pnodo &nuevo) { nuevo=new tnodo; if(nuevo!=NULL){ cout << "Ingrese valor: "; cin >> nuevo->dato; nuevo->sig=NULL; } else{ cout << "MEMORIA INSUFICIENTE" << endl; } } void agregar_final(tlista &lista, pnodo nuevo) { pnodo i; if(lista.inicio==NULL){ lista.inicio=nuevo; } else{ for(i=lista.inicio;i->sig!=NULL;i=i->sig); i->sig=nuevo; } } int sumar_nodos(pnodo inicio) { if(inicio==NULL){ return 0; } else{ return inicio->dato+sumar_nodos(inicio->sig); } } void mostrar(tlista lista) { pnodo i; if(lista.inicio!=NULL){ for(i=lista.inicio;i!=NULL;i=i->sig){ cout << "Nodo: " << i->dato << endl; } cout << endl; } else{ cout << "LISTA VACIA" << endl; } }
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
|
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
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
Mensajes: 634
youtu.be/0YhflLRE-DA
|
La profe dijo que ya esta bien, igual gracias
|
|
|
En línea
|
7w7
|
|
|
Elias Flores
Desconectado
Mensajes: 13
|
Tengo una funcion que suma los elementos de un vector recursion en su estado mas puro espero te sirva saludos! #include <iostream> #include <cstdlib> #include <conio.h> #include <ctime> using namespace std; void cargar (int arreglo[],int n); void mostrar (int arreglo[],int num2,int n); int sumavector (int num1,int arreglo[],int num2,int n); int main (){ int n,suma; cout<<"ingrese la longitud del vector: ";cin>>n; int arreglo[n]; cargar (arreglo,n); mostrar (arreglo,0,n); suma =sumavector(0,arreglo,0,n); cout<<"\nla suma es: "<<suma<<endl; getch(); return 0; } int sumavector (int num1,int arreglo[],int num2,int n){ if (n==num2){//caso base elemental mi querdo watson :D return num1; }else{ num1=num1+arreglo[num2]; return sumavector(num1,arreglo,num2+1,n);} } void cargar (int arreglo[],int n){//en el siguiente metodo le pasado el vector y el indice que comienza en cero = num2 if (n>0){ //num2 debe ir aumentando de 1 en 1 srand(time(0)); //el srand sirve para sincronizar el rand con el reloj del pc cargar(arreglo,n-1); //llamamos a la misma funcion cargar pero menos el ultimo dato n-1 arreglo[num2]=1+rand()% 10;} } void mostrar (int arreglo[],int num2,int n){ if (n>0){ mostrar(arreglo,num2+1,n-1); cout<<arreglo[num2]<<" ";} }
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
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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 int sumar(arreglo a, int n) { if(n==-1) return 0; else return a[n]+sumar(a,n-1); }
|
|
« Última modificación: 13 Septiembre 2018, 01:34 am por Beginner Web »
|
En línea
|
7w7
|
|
|
Elias Flores
Desconectado
Mensajes: 13
|
Estoy en la "U" 3 semestre 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
Mensajes: 634
youtu.be/0YhflLRE-DA
|
Que bueno, yo recien acabo de empezar el secundario primer año
|
|
|
En línea
|
7w7
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda con recursividad
.NET (C#, VB.NET, ASP)
|
eagle17
|
2
|
3,447
|
1 Marzo 2009, 10:29 am
por bitarray
|
|
|
ayuda recursividad
.NET (C#, VB.NET, ASP)
|
Choclito
|
2
|
2,881
|
14 Mayo 2009, 03:38 am
por Choclito
|
|
|
Ayuda con Recursividad
.NET (C#, VB.NET, ASP)
|
40
|
3
|
2,621
|
14 Septiembre 2015, 18:19 pm
por DarK_FirefoX
|
|
|
Ayuda recursividad
« 1 2 »
Programación C/C++
|
JUHC
|
10
|
10,287
|
8 Agosto 2016, 16:41 pm
por AlbertoBSD
|
|
|
AYUDA CON RECURSIVIDAD
« 1 2 »
Programación C/C++
|
alpachino98
|
11
|
5,603
|
7 Febrero 2018, 15:08 pm
por dijsktra
|
|