Ayuda con recursividad

Iniciado por Beginner Web, 2 Septiembre 2018, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

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 (cpp) [Seleccionar]
typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
};


Código (cpp) [Seleccionar]
int sumar(tlista lista)
{
pnodo i;
if(lista.inicio==NULL){
return 0;
}
else{
return lista.inicio->dato+sumar(i=i->sig);
}
}


;-)
7w7

MAFUS

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.

Beginner Web

#2
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 (cpp) [Seleccionar]
#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".
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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS

Y si el ejercicio se hace con una pila en vez de una lista se hace casi todo de forma automática.

Beginner Web

La profe dijo que ya esta bien, igual gracias
7w7

Elias Flores

#6
Tengo una funcion que suma los elementos de un vector recursion en su estado mas puro espero te sirva saludos!

Código (cpp) [Seleccionar]
#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.

Beginner Web

#7
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 (cpp) [Seleccionar]
int sumar(arreglo a, int n)
{
if(n==-1)
return 0;
else
return a[n]+sumar(a,n-1);
}
7w7

Elias Flores

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

Beginner Web

Que bueno, yo recien acabo de empezar el secundario primer año
7w7