C/Visual C - FUNCIONES RECURSIVAS

 
Vista:

FUNCIONES RECURSIVAS

Publicado por JUAN PABLO (1 intervención) el 04/05/2007 21:05:11
HOLA AMIGOS NECESITO ME AYUDEN A RESOLVER ESTOS PROBLEMAS UTILIZANDO C ++

FUNCIONES RECURSIVAS

1) Tengo que diseñar una funcion recursiva que devuela la suma de los valores de una pila de enteros.

2) Diseñar una funcion recursiva que liste en ordenar inversos los elementos de una Pila.

3) Diseñar una funcion recursiva que liste en ordenar inversos los elementos de una Cola.

4) Diseñar una funcion que sume 1 a un numero binario que viene almacenado en una lista, donde el primer elemento de la lista sera el bit de menor peso del numero.

5) Decimos que una pila P es sombrero de otra pila Q, si todos los elementos de P están en Q, en el mismo orden y en las posiciones más cercanas a la cima de la pila (incluida esta). Por definición la pila vacía es cima de cualquier otra.
Diseñar una función que dadas 2 pilas nos diga si una es sombrero de otra.

PORFAVOR SI ALGUIEN PUEDE AYUDARME SE LOS BOY A AGRADER MUCHO O SI M PUEDEN DAR UNA DIRECCION PARA ENCONTRAR RESUELTOS ESTOS CASOS GRACIAS.............................

ATT. J. P.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:FUNCIONES RECURSIVAS

Publicado por Nelek (816 intervenciones) el 07/05/2007 09:01:17
Hola,

por ejemplo para el 1)

for (int i = 0; i < limite_pila; i++)
{
suma += pila[i];
}

Esto va sumando cada elemento de la pila y guarda el resultado en suma para sumarle el siguiente elemento.

para el 2)

NuevaPasada:
for (int i = 0; i < limite_pila; i++)
{
if (pila_origen[i] < minimo)
{
minimo = pila_origen [i];
posicion = i;
}
}
pila_destino [contador] = minimo;
pila_origen[posicion] = valor_nulo;
contador++;

if (contador < limite_pila)
goto NuevaPasada;

Si inicializas minimo al valor maximo en la primera pasada y luego haces ese bucle sabras cual es el valor minimo de esa pasada. Lo guardas en la pila destino, pones algo que no te estorbe en la posicion de donde extraiste el minimo de esa pasada y compruebas si ya has guardado todos los elementos, si no es asi vuelves a empezar para buscar el segundo.

El resto intentalo tu, y si te encallas... pregunta cosas concretas. O pon lo que has hecho para que te lo corrijamos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Diego (13 intervenciones) el 07/05/2007 23:49:37
Buenas, soy nuevo aqui pero queria tratar de responderte.

1) Una opcion es esta:

int sumar(tipo_pila *pila){
int rdo = 0;

if(pila){
rdo +=sumar(pila->siguiente);

return pila->numero;
}

return 0;
}

2) 3 ) Para ambos puntos podria ser esta una opcion:

int listar(tipo_pila *pila)
{
if(pila){
listar(pila->siguiente);
printf("%d\n",pila->numero); /* Suponiendo que la pila es la misma que la anterior */
}
return 0;
}

Bueno aca supongo que tenes una guia. Cualquier cosa pregunta de nuevo

Saludos, Diego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Nelek (816 intervenciones) el 08/05/2007 15:11:03
No es del todo correcto, te faltaria la recursividad ya que con ello solamente estas sumando un elemento. Tiene que anyadir un for o un while y despues de sumar un elemento pasar al siguiente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Tom (27 intervenciones) el 08/05/2007 21:45:22
Nelek, la recursividad (hablando de funciones) consiste en diseñar funciones que se llaman a sí mismas, sin necesidad de bucles for o while, usando en vez de variables intermedias locales a la función los propios parámetros almacenados en el stack.

Por ejemplo, algo así:

int sumarLista(nodoLista *nodo) {
if(! nodo) return(0);
return(nodo->valor + sumarLista(nodo->siguienteNodo));
}

Ignoro si esto funciona, es sólo una idea (muy cercana, como ves, a la que ha expuesto Diego).

Observa la diferencia con tu propuesta:

int sumarLista(nodoLista *nodo) {
int suma = 0;
if(nodo) {
nodoLista *actual = nodo;
do {
suma += actual->valor;
} while((actual = actual->siguienteNodo) != NULL);
}
return(suma);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Nelek (816 intervenciones) el 09/05/2007 09:50:50
Hola Tom,

tienes razon. En mi caso el problema esta en que, a veces, no entiendo bien lo que se pide ya que no soy de la rama de informatica, aunque haya acabado programando. De todas maneras, el ejemplo que propuso Diego pasaba la lista como parametro, no el nodo. Tu propuesta me parece mas acertada.

Nunca te acostaras sin saber una cosa mas :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Diego (1 intervención) el 09/05/2007 17:23:39
Hola.

La funcion de Tom es la correcta, ya que yo en ningun momento retorno el valor de la suma.

Por otra parte, nodoLista *nodo es lo que yo llame tipo_pila *pila. Si bien tenes razon que la propuesta de Tom es mas acertada, no me parece que el fundamento sea que yo paso como parametro algo diferente

Saludos, Diego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:FUNCIONES RECURSIVAS

Publicado por Nelek (816 intervenciones) el 10/05/2007 07:36:30
Hola Diego,

si estoy equivocado, lo estoy. De fallos se aprende y esta vez cometi un par. El primero confundir el concepto de funcion recursiva con lo del bucle y, el segundo, no mirar mas detenidamente tu funcion. Tu parametro tipo_pila* pila, lo usas como pila->siguiente, por lo tanto es uno de los nodos y yo lo confundi por la pila entera. Mi fallo esta ahi y por ello me disculpo, pero te pido que para futuros mensajes intentes usar nombres univocos y concretos para el punto en el que se esta, asi se evita fallos de interpretacion como el que he tenido yo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar