[C con Clase] recursividad

Yolmer Rosales yolmer.rosales en gmail.com
Dom Mar 20 12:21:33 CET 2016


hola ya resolví el ejercicio pero todavía tengo dudas...

por ejemplo la función recibe tres parámetros, no se si se pueda hacer con
un sólo parámetro. pero la dificultad la tuve con la memoria dinámica

¿que pasaría si reservo memoria para una cadena dentro de un subrutina?

¿sigue existiendo al salir?

¿la puedo liberar en otro lado? creo que si pero no se como...

En otro orden de ideas para resolver el ejercicio tuve que crear un par de
funciones más una para truncar la cadena y otra para añadir un caracter,
esto también me gustaría saber si se puede mejorar y en que forma

las tres funciones quedaron de esta manera:

esta es la que invierte la cadena obviamente
char *voltea(char* cad, char* inv, char* aux) //cad: la cadena que se va a
invertir inv: el resultado  aux: para partir la cadena
{
int ind = strlen(cad);
ind--;
if(0 < ind)
{
return voltea(strtrc(cad,aux),stradd(inv,cad[ind]),aux);
}
stradd(inv,cad[ind]);
return inv;
};
///////////////////////////////////////////////////////////////////////////////

esta función sirve para partir truncar la cadena conservo la original y
paso la cadena truncada como retorno y en el parámetro

char *strtrc(char *cad, char *aux)
{
//char *aux;
int tam = strlen(cad);
tam--;
//aux = new char[tam];
for (int i = 0; i < (tam); i++)
{
strcpy(&aux[i],&cad[i]);
if (i = tam)
{
strcpy(&aux[i],"\0");
}
}
return aux;
};
////////////////////////////////////////////////////////////////////////////////

con esta función añado un caracter a la cadena y el caracter nulo

char *stradd(char *cad, char c)
{
int sz = strlen(cad);
cad[sz] = c; cad[sz+1] = '\0';;
return cad;
}


el ejercicio logra lo que se planteo pero no se si es necesario escribir
tanto código me siento





El 13 de marzo de 2016, 18:36, Salvador Pozo <salvapozo en gmail.com> escribió:

> El pasado 2016-03-13 18:16:36, yolmer escribió:
>
> y> Hola lista:
> y> me topé con un ejercicio de recursividad que no he logrado realizar de
> la
> y> forma que quiero el enunciado es:
>
> Hola:
>
> Te comento sobre tu propuesta.
>
> y> int voltea( char *c)
>
> Piensa que para poder usar recursividad, la función debería retornar un
> objeto del mismo tipo que el parámetro, en este caso, una cadena. El
> parámetro puede ser (y debería) una cadena constante, pero el valor de
> retorno no tiene por qué.
>
> y> {
> y> if (strlen(c) > 1)
> y> {
> y> voltea(c+1);
> y> cout << c[0] << " ";
>
> Um, la idea es que la función devuelva la cadena al revés, no que la
> muestre en pantalla.
> La forma recursiva de voltear una cadena es, dividir la cadena en dos:
> - Una cadena de un carácter, formada por el primer carácter de la cadena a
> voltear.
> - Una cadena con el resto, que se usará como argumento recursivo.
> El retorno de "Voltear(cadena2)" se debe concatenar con cadena1.
>
> y> return 0;
> y> }
>
> y> cout <<  c << " ";
> y> return 0;
> y> }
>
> El segundo intento va mejor encaminado, pero te queda corregir algunas
> cosillas.
> Por ejemplo voltea(c+1) no tiene sentido, no se puede sumar 1 a una cadena.
> Otro error es que concatenar c, y &c[0] concatena dos veces la cadena c,
> no la voltea de ninguna forma.
>
> Piensa un poco más, creo que estás cerca de la solución, y me consta que
> preferirías encontrala por ti mismo. ¡Ánimo!
>
> Hasta pronto.
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20160320/f210ad56/attachment.html>


Más información sobre la lista de distribución Cconclase