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

 

 


Tema destacado: Estamos en la red social de Mastodon


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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda recursividad
« en: 28 Julio 2016, 11:25 am »

Escribir una funcion recursiva en c++ que a partir de una cadena de caracteres me muestre la cadena inversa y elimine las letras repetidas. Por ejemplo si introduzco : aacbbd, deberia de mostrar :dbca


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Ayuda recursividad
« Respuesta #1 en: 28 Julio 2016, 11:53 am »

¿Y qué llevas hecho?

Un saludo.


En línea

Regístrate en
JUHC

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda recursividad
« Respuesta #2 en: 28 Julio 2016, 12:41 pm »

¿Y qué llevas hecho?

Un saludo.


#include <iostream>
#include <string.h>
#include<string>

using namespace std;
char InversoSimplificado(char c, int tam);
int main()
{
    char c[20];
    int tam;

    cout << "Introduce una cadena: ";
    cin>>c;

    tam=strlen(c);  //TAMAÑO DE LA CADENA

    cout<<endl<<endl;
    cout<< "La cadena invertida y sin repeticiones es: "<< InversoSimplificado(c,tam);
    return 0;
}

char InversoSimplificado (char c ,int tam){


// CONDICION DE PARADA PARA INVERTIR PALABRA:

if (tam==1)




// LLAMADA RECURSIVA PARA INVERTIR PALABRA:

return InversoSimplificado (c, tam-1) + (c, 1);

}
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Ayuda recursividad
« Respuesta #3 en: 28 Julio 2016, 12:46 pm »

Empecemos por lo más simple, si necesitas invertir una cadena ¿por qué declaras y defines la función pasando y devolviendo un único carácter?

Código
  1. ¿char? InversoSimplificado(¿char? c, int tam);

En todo caso sería:
Código
  1. char* InversoSimplificado(char* c, int tam);

Por otra parte:
Código
  1. return InversoSimplificado (c, tam-1) + ¿(c, 1)?;

¿Qué intentas hacer con lo que está entre interrogaciones?
« Última modificación: 28 Julio 2016, 12:50 pm por avesudra » En línea

Regístrate en
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Ayuda recursividad
« Respuesta #4 en: 6 Agosto 2016, 00:27 am »

Hola avesudra. Bueno, ya que piden resolverlo con recursividad, se me ocurre crear dos funciones, una para eliminar los caracteres repetidos, y otra para invertir la cadena.

Por ejemplo, sea la cadena "aaaabbbcccddddeee", entonces la idea es que cada vez que llamemos la función se elimina una repetición. La función compara el primer carácter de la cadena con el segundo, si son iguales elimina la repetición de este carácter y se vuelve a llamar a sí misma. Tras esto, compara el segundo con el tercero y así sucesivamente. Entonces tras la primera ejecución devuelve "abbbcccddddeee", tras la segunda devuelve "abcccddddeee", y así sucesivamente. La función se ha codificado de manera que imprima los resultados parciales y así se pueda ver cómo va trabajando.

En cuánto a la parte de invertir la cadena, lo que hacemos es intercambiar los caracteres opuestos con respecto al centro, desde afuera hacia adentro. Por ejemplo, dada la cadena "abcde", intercambiamos 1º y 5º, luego 2º y 4º y así sucesivamente. El proceso se detiene cuando la cantidad de reordenamientos supera la mitad de la longitud de la cadena.

Código
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. void elimina_repetido( char *s );
  9. int invertir_cadena( char *s );
  10.  
  11. int main(void) {
  12.  
  13. char s1[100];
  14.  
  15. sprintf( s1, "aaaabbbcccddddee");
  16.  
  17. cout << "Eliminando repetidos" << endl
  18. << "==============================" << endl;
  19. elimina_repetido ( s1 );
  20.  
  21. cout << "Invirtiendo cadena" << endl
  22. << "==============================" << endl;
  23. invertir_cadena( s1 );
  24.  
  25. return 0;
  26. }
  27.  
  28. /* Devuelve cero cuando se termine de analizar toda la
  29.  * cadena, y 1 si falta por analizar.
  30.  * La cadena transformada queda almacenada en el mismo
  31.  * argumento s.
  32.  * La función almacena la posición del último carácter leído
  33.  * (usando variables internas estáticas)
  34.  */
  35. void elimina_repetido( char* s )
  36. {
  37. static int pos = 0;
  38. int k; /* indice auxiliar */
  39. int count; /* cuantos caracteres repetidos */
  40. char c1;
  41.  
  42. c1 = s[pos];
  43. if ( c1 == '\0' ) return; /* terminó de analizar la cadena*/
  44.  
  45. k = pos + 1;
  46. if ( s[k] == c1 ) {
  47. while ( s[k] == c1 && s[k] != '\0' ) {
  48. k++;
  49. }
  50. count = k - ( pos + 1 ); /* cantidad de caracteres repetidos, después de c1 */
  51.  
  52. /* Ahora s[k] es el primer carácter posterior a s[pos] distinto
  53. * de c1. Vamos a mover hacia atrás los restantes caracteres,
  54. * un total de <count> posiciones
  55. */
  56. while ( s[k] != '\0' ) {
  57. s[k - count] = s[k];
  58. k++;
  59. }
  60. s[k - count] = '\0';
  61. }
  62.  
  63. /* mostrar la cadena */
  64. cout << "   " << s << endl;
  65.  
  66. /* preparar para el próximo llamado de la función */
  67. pos++;
  68. elimina_repetido( s );
  69. }
  70.  
  71. /* Reordena la cadena, intercambiando los caracteres en posiciones
  72.  * opuestas respecto al centro, desde afuera hacia adentro.
  73.  * El proceso termina cuando el número de reordenamientos
  74.  * supera la mitad de la longitud de la cadena.
  75.  */
  76. int invertir_cadena( char *s )
  77. {
  78. static int count = 0;
  79. int k, N;
  80. char c;
  81.  
  82. N = strlen(s);
  83. if ( count == N || N == 0 ) return 0;
  84.  
  85. /* intercambia las posiciones */
  86. c = s[count];
  87. s[count] = s[N - count - 1];
  88. s[N - count - 1] = c;
  89.  
  90. cout << "   " << s << endl;
  91.  
  92. count++;
  93. if  ( count < N / 2 ) invertir_cadena( s );
  94. }

Aquí podemos ver el resultado:

Eliminando repetidos
==============================
   abbbcccddddee
   abcccddddee
   abcddddee
   abcdee
   abcde
Invirtiendo cadena
==============================
   ebcda
   edcba


Un saludo, Yoel.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
user-marcos

Desconectado Desconectado

Mensajes: 159


Ver Perfil
Re: Ayuda recursividad
« Respuesta #5 en: 6 Agosto 2016, 01:07 am »

Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. bool equal(string C, char c)
  5. {
  6.  if(C.length() == 0) return true;
  7.  
  8.  if(c == C[C.length()-1]) return false;
  9.  
  10.  return  equal(C.erase(C.length()-1), c);
  11. }
  12.  
  13.  
  14. string function (string cadena, string saveCadena)
  15. {
  16.  if(cadena.length() == 0) return saveCadena;
  17.  
  18.  if(equal(saveCadena, cadena[cadena.length()-1]))
  19.    return function(cadena.erase(cadena.length()-1), saveCadena + cadena[cadena.length()-1]);
  20.  return  function(cadena.erase(cadena.length()-1), saveCadena);
  21. }
  22.  
  23. int main()
  24. {
  25.  cout << function("aaaabbbbccz", "");
  26. }
  27.  
  28.  
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda recursividad
« Respuesta #6 en: 6 Agosto 2016, 01:57 am »

¿Y no es más fácil hacer lo siguiente?

Código
  1. char funcion(char *s)
  2. {
  3.    if(!(*s))
  4.        return *s;
  5.  
  6.    if(*s != funcion(s + 1))
  7.        printf("%c",*s);
  8.  
  9.    return *s;
  10. }
  11.  

O si lo preferís con subindices...
Código
  1. char funcion(char *s)
  2. {
  3.    if(!(s[0]))
  4.        return s[0];
  5.  
  6.    if(s[0] != funcion(&s[1]))
  7.        printf("%c",s[0]);
  8.  
  9.    return s[0];
  10. }
  11.  

A fin de cuentas lo que le piden es una función recursiva que muestre la cadena invertida y sin repeticiones. Que la muestre. No que la almacene en ningún lado.
« Última modificación: 6 Agosto 2016, 02:06 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Ayuda recursividad
« Respuesta #7 en: 6 Agosto 2016, 03:04 am »

Supongo que la debo utilizar de esta manera, ¿no?
Código
  1. int main(void) {
  2.  
  3.    char s1[100];
  4.  
  5.    sprintf( s1, "aaaabbbcccddddee");
  6.  
  7.    funcion(s1);
  8.  
  9.    return 0;
  10. }
  11.  
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Ayuda recursividad
« Respuesta #8 en: 6 Agosto 2016, 21:34 pm »

La idea de do-while es interesante, yo la adapté de la siguiente manera para crear un código más breve. La idea es empezar por el último carácter (no nulo) de la cadena y comparar con el siguiente. Si son diferentes, imprimir, sino, retroceder un carácter. En la función
Código
  1. void elimina_repetido2( char *start, char *c_ptr )
  2. {
  3.  
  4.    static char c = '\0';
  5.  
  6.    if ( c_ptr == start || *c_ptr == '\0' )
  7.        return;
  8.    else {
  9.        if ( *c_ptr != c ) printf( "%c", *c_ptr );
  10.        c = *c_ptr;
  11.        c_ptr--;
  12.        elimina_repetido2( start, c_ptr );
  13.    }
  14. }
  15.  
start es un apuntador al inicio de la cadena (para saber cuando detenernos al retroceder), c_ptr es un apuntador al carácter actualmente analizado (empezando por el último). La variable interna c funciona como auxiliar para almacenar el valor del carácter siguiente al apuntado por c_ptr.

Programa principal:
Código
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4.  
  5. int main(void) {
  6.  
  7.    char s1[100];
  8.  
  9.    cout << "Intro cadena: ";
  10.    cin >> s1;
  11.  
  12.    cout << endl << "Salida:";
  13.    elimina_repetido2( s1, s1 + strlen(s1) - 1 );
  14.    cout << endl;
  15.  
  16.    return 0;
  17. }

Salida en pantalla:

Intro cadena: aaabbbccdddeeee

Salida:edcba
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
JUHC

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda recursividad
« Respuesta #9 en: 8 Agosto 2016, 10:13 am »

¿Y no es más fácil hacer lo siguiente?

Código
  1. char funcion(char *s)
  2. {
  3.    if(!(*s))
  4.        return *s;
  5.  
  6.    if(*s != funcion(s + 1))
  7.        printf("%c",*s);
  8.  
  9.    return *s;
  10. }
  11.  


A fin de cuentas lo que le piden es una función recursiva que muestre la cadena invertida y sin repeticiones. Que la muestre. No que la almacene en ningún lado.


Me puedes explicar que es lo que hace ? :)
En línea

Páginas: [1] 2 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,269 Último mensaje 1 Marzo 2009, 10:29 am
por bitarray
ayuda recursividad
.NET (C#, VB.NET, ASP)
Choclito 2 2,708 Último mensaje 14 Mayo 2009, 03:38 am
por Choclito
Ayuda con Recursividad
.NET (C#, VB.NET, ASP)
40 3 2,429 Último mensaje 14 Septiembre 2015, 18:19 pm
por DarK_FirefoX
AYUDA CON RECURSIVIDAD « 1 2 »
Programación C/C++
alpachino98 11 5,043 Último mensaje 7 Febrero 2018, 15:08 pm
por dijsktra
Ayuda con recursividad
Programación C/C++
Beginner Web 9 2,657 Último mensaje 16 Septiembre 2018, 16:35 pm
por Beginner Web
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines