Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] funciones recursivas

Estas en el tema de funciones recursivas en el foro de C/C++ en Foros del Web. Bueno... Anoche estube contestando un post por internet y se trataba de funciones recursivas No tengo mucha practica con eso pero logre hacer un ejercicio ...
  #1 (permalink)  
Antiguo 11/11/2014, 09:19
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Pregunta funciones recursivas

Bueno... Anoche estube contestando un post por internet y se trataba de funciones recursivas

No tengo mucha practica con eso pero logre hacer un ejercicio que para mi ha sido algo duro jaja, pero logre hacer lo que postare mas abajo.

El usuario habia pedido que dado un numero como 3183 de 4 digitos.
comaparase cada digito con el ultimo y si fuera mayor o igual, se multiplicara por el seguiente.

El numero 3183 seria n = 3*8*3 que daria 72. El 1 se desecha ya que no es mayor que el ultimo.

Mi pregunta es....
¿Hay alguna forma mas facil de hacer que la que hice yo? Lo digo por que con recursivas no tengo NPI XDDD

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int f ( int n ) {
  5.     static int op = 0;
  6.     static int a;
  7.     static int u;
  8.    
  9.     if ( op == 0 ) {
  10.         op++;
  11.         a = 1;
  12.         u = n % 10;
  13.     }
  14.    
  15.     if ( n > 0 ) {
  16.         if ( n % 10 >= u ) {
  17.             a = a * ( n % 10 );
  18.             f ( n = n / 10 );
  19.         } else {
  20.             cout << "Desechando la ultima posicion de n: " << n % 10 << ". Es menor que static u: " << u << endl;
  21.             n = n / 10;
  22.             cout << "n ahora contiene " << n << ", y se envia a f() para seguir multiplicando..." << endl;
  23.             f ( n );
  24.         }
  25.        
  26.        
  27.     }
  28.    
  29.     cout << "Retornando: " << a << endl;
  30.     return a;
  31. }
  32.  
  33. int main() {
  34.     //funciona con numeros mayores que 4 digitos... lo que quepa en un int vamos XDDD, pero no poner numeros muy grandes o puedes literalmente causar un stackoverflow XD
  35.    
  36.     int n =  3183;  // <---cambie aqui para ver diferentes resultados.
  37.     cout << f ( n ) << endl;
  38.  
  39.     cin.ignore(); //pausa el programa
  40.     return 0;
  41. }

¿Y ademas cual es la ventaja de usar eso?
Suerte chicos
  #2 (permalink)  
Antiguo 11/11/2014, 10:16
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: funciones recursivas

Una aproximación:

Código C++:
Ver original
  1. int f( int numero )
  2. {
  3.   int cifras = (int)log10( numero );
  4.   if ( cifras == 0 )
  5.     return 0;
  6.  
  7.   int ultimo = numero % 10;
  8.   int primero = numero / pow( 10, cifras );
  9.  
  10.   numero -= primero * pow( 10, cifras );
  11.  
  12.   int to_return = f( numero );
  13.  
  14.   if ( primero >= ultimo )
  15.   {
  16.     if ( to_return != 0 )
  17.       to_return *= primero;
  18.     else
  19.       to_return = primero;
  20.   }
  21.  
  22.   return to_return;
  23. }

Última edición por eferion; 11/11/2014 a las 10:20 Razón: He reducido el número de "returns"
  #3 (permalink)  
Antiguo 11/11/2014, 10:23
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por vangodp Ver Mensaje
Bueno... Anoche estube contestando un post por internet y se trataba de funciones recursivas

No tengo mucha practica con eso pero logre hacer un ejercicio que para mi ha sido algo duro jaja, pero logre hacer lo que postare mas abajo.

El usuario habia pedido que dado un numero como 3183 de 4 digitos.
comaparase cada digito con el ultimo y si fuera mayor o igual, se multiplicara por el seguiente.

El numero 3183 seria n = 3*8*3 que daria 72. El 1 se desecha ya que no es mayor que el ultimo.

Mi pregunta es....
¿Hay alguna forma mas facil de hacer que la que hice yo? Lo digo por que con recursivas no tengo NPI XDDD
......................
¿Y ademas cual es la ventaja de usar eso?
Suerte chicos
Ventajas respecto a un ciclo más bien pocas ya que hay que estar invocando a la función una y otra vez, cosa que en un ciclo simple te lo ahorras. Como ejercicio no está mal.

Te dejo en el código un par de cout para que veas como trabaja. Si se los pones en tu código veras que está trabajando de más y es por la falta de los return.

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int f ( int n ) {
  5.     static int a = 1 , u = n % 10 ;
  6.     if ( n > 0 ) {
  7.         if ( n % 10 >= u )
  8.             a = a * ( n % 10 ) , cout << "a =  " << a << endl;              
  9.         else
  10.             cout << "Desechando la ultima posicion de n: " << n % 10 << ". Es menor que static u: " << u << endl
  11.             , cout << "n ahora contiene " << n / 10 << ", y se envia a f() para seguir multiplicando..." << endl;
  12.         return f ( n / 10 );
  13.     }
  14.     cout << "Retornando: " << a << endl;
  15.     return a;
  16. }
  17.  
  18. int main() {
  19.     int n =  3183;  
  20.     cout << f ( n ) << endl;
  21.     cin.ignore();
  22.     return 0;
  23. }

Un fuerte saludo vangodp

¡¡¡Saluditos!!!

  #4 (permalink)  
Antiguo 11/11/2014, 10:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: funciones recursivas

Sabía que si me ponía a explicar alguien me acababa pisando la respuesta... por eso puse primero el código jejeje.

Poco que añadir a lo aportado por leosansan

Quizás, comentar que la mayor ventaja de usar recursividad es que no se van a pisar las variables entre diferentes ciclos. En un bucle, sin embargo, tienes que andar con cuidado si necesitas guardar resultados intermedios.
  #5 (permalink)  
Antiguo 11/11/2014, 14:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: funciones recursivas

gracias compañeros... voy estudiar vuestros codigos para ver si me ilumino algo sobre el tema jeje.


Edit: eferion.. algo me falla en tu código que me retorna 24?
Me puedes comentar algo tu codigo =)

Última edición por vangodp; 11/11/2014 a las 15:07
  #6 (permalink)  
Antiguo 11/11/2014, 16:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: funciones recursivas

Pequeño fallo, no leí lo de que había que multiplicar el resultado por el valor del último dígito :)

Ya aprovecho para dejar solo un return en la función.

Código C++:
Ver original
  1. int f( int numero )
  2. {
  3.   int to_return = numero;
  4.  
  5.   int cifras = (int)log10( numero );
  6.   if ( cifras > 0 )
  7.   {
  8.     int ultimo = numero % 10;
  9.     int primero = numero / pow( 10, cifras );
  10.  
  11.     numero -= primero * pow( 10, cifras );
  12.  
  13.     to_return = f( numero );
  14.  
  15.     if ( primero >= ultimo )
  16.       to_return *= primero;
  17.   }
  18.  
  19.   return to_return;
  20. }
  #7 (permalink)  
Antiguo 12/11/2014, 04:47
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Respuesta: funciones recursivas

Otra posible solución:
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int createProduct(int n){
  5.     if(n < 10)return n;
  6.     int last = n % 10;
  7.     int curr = (n /= 10) % 10;
  8.     return ((curr >= last)? curr : 1) * createProduct((n/10)*10 + last);
  9. }
  10.  
  11. int main() {
  12.     cout << createProduct(3183) << endl;
  13.     return 0;
  14. }

No es una buena idea utilizar variables estáticas en funciones recursivas, finalmente no dejan de ser variables globales con visibilidad a nivel de función, por lo que si hubieran llamadas concurrentes lo más probable es que no se obtendría el resultado esperado.
  #8 (permalink)  
Antiguo 12/11/2014, 06:20
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: funciones recursivas

Peazo de codigo fightmx. XDD
Te lo has dejado en nada. jejeje
Gracias por compartir.
Nunca las utiliso a las estaticas, pero debido a mi poca(por no decir ninguna) exp con recursivas no sabia lo que poner. Me queda que practicar algo.
suerte! (y)
  #9 (permalink)  
Antiguo 12/11/2014, 08:17
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por fightmx Ver Mensaje
No es una buena idea utilizar variables estáticas en funciones recursivas, finalmente no dejan de ser variables globales con visibilidad a nivel de función, por lo que si hubieran llamadas concurrentes lo más probable es que no se obtendría el resultado esperado.
Todo estriba en el uso adecuado de las mismas, por algo forma parte del estándar de C.

Y puestos a prescindir de las variables estáticas, por qué no prescindir de las que no lo son:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int f ( int n ) {
  5.     if ( n < 10 ) return n ;
  6.     return  ( ( ( n / 10 ) % 10 ) >= ( n % 10 ) ?  ( ( n / 10 ) % 10 ) : 1 ) * f ( ( n / 100 ) * 10 + n % 10 ) ;
  7. }
  8.  
  9. int main() {
  10.     cout << f ( 315283 ) << endl ;
  11.      return 0 ;
  12. }

Espero que no se me haya ido la olla .

¡¡¡Saluditos!!!

  #10 (permalink)  
Antiguo 12/11/2014, 09:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: funciones recursivas

leosansan, aún se puede compactar un poquito más para hacerlo "más legible" :D

Código C++:
Ver original
  1. #define DIV(n) (n / 10)
  2. #define MD(n)  (n % 10)
  3. #define MUL(n) (n * 10)
  4. #define MOD(n) MD( DIV( n ) )
  5. #define MUD(n) MUL( DIV( n ) )
  6.  
  7. int f ( int n )
  8. {
  9.   if ( n < 10 ) return n ;
  10.   return  ( MOD(n) >= MD(n) ?  MOD(n) : 1 ) * f ( MUD(DIV(n)) + MD(n) ) ;
  11. }
  #11 (permalink)  
Antiguo 12/11/2014, 09:39
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por eferion Ver Mensaje
leosansan, aún se puede compactar un poquito más para hacerlo "más legible" :D
Comprenderás que "eso" era lo menos que esperaba del Rey de las macros.

¡¡¡Saluditos!!!

  #12 (permalink)  
Antiguo 12/11/2014, 09:47
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: funciones recursivas

Cita:
Iniciado por eferion Ver Mensaje
leosansan, aún se puede compactar un poquito más para hacerlo "más legible" :D
La verdad aun puede compactarse bastante no entiendo porque complicarse con tantas operaciones %:


Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int f(int n)
  4. {
  5.   if (n < 10) return n;
  6.   return (n % 10) * f(n / 10);
  7. }
  8.  
  9. int main(void)
  10. {
  11.     printf("%d", f(3183));
  12.     return(0);
  13. }

Saludos
  #13 (permalink)  
Antiguo 12/11/2014, 09:56
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: funciones recursivas

Prueba con 3283 y lo entenderás. El resultado debería seguir siendo 72
  #14 (permalink)  
Antiguo 12/11/2014, 09:59
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: funciones recursivas

Cita:
Iniciado por eferion Ver Mensaje
Prueba con 3283 y lo entenderás. El resultado debería seguir siendo 72
XD ya me di cuenta

En ese caso lo dejo con la correspondiente modificación:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int f(int n, int u)
  4. {
  5.   if (n < 10) return n;
  6.   return (n % 10 >= u ? n % 10 : 1) * f(n / 10, u);
  7. }
  8.  
  9. int main(void)
  10. {
  11.     printf("%d", f(3283, 3283 % 10));
  12.     return(0);
  13. }

Saludos

Última edición por kutcher; 12/11/2014 a las 10:17
  #15 (permalink)  
Antiguo 12/11/2014, 10:37
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por kutcher Ver Mensaje
XD ya me di cuenta

En ese caso lo dejo con la correspondiente modificación:
.................................................
Peta con 3284 y es debido al return de n que hay que modificarlo:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int f ( int num , int ultimoDigito ) {
  4.   if ( num < 10 ) return ( num >= ultimoDigito ) ? num : 1 ;
  5.   return ( ( num % 10 ) >= ultimoDigito ? num % 10 : 1 ) * f ( num / 10 , ultimoDigito ) ;
  6. }
  7.  
  8. int main ( void ) {
  9.     int numero = 31258364 ;
  10.     printf ( "%d" , f ( numero , numero % 10 ) ) ;
  11.     return(0);
  12. }

¡¡¡Saluditos!!!


Última edición por leosansan; 12/11/2014 a las 10:57
  #16 (permalink)  
Antiguo 12/11/2014, 12:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: funciones recursivas

Gracias a todos por sus ideas y ejemplos. (y)
  #17 (permalink)  
Antiguo 12/11/2014, 14:21
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: funciones recursivas

Cita:
Iniciado por leosansan Ver Mensaje
Peta con 3284 y es debido al return de n que hay que modificarlo:
xD eso me pasa por no testear mis códigos, aprovecho de paso para dejar una ultima aproximación pero esta vez usando otra función recursiva de intermedio:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int f2( int n, int u )
  4. {
  5.     int d = n%10, r = d;
  6.     if( d < u ) r = 1;
  7.     if( n < 10 ) return r;
  8.     return r * f2( n/10, u );
  9. }
  10.  
  11. int f( int n )
  12. {
  13.     if ( n < 10 ) return n ;
  14.     return n%10 * f2(n/10, n%10);
  15. }
  16.  
  17. int main(void)
  18. {
  19.     printf("%d", f(3284));
  20.     return(0);
  21. }

Saludos

Última edición por kutcher; 12/11/2014 a las 14:28
  #18 (permalink)  
Antiguo 13/11/2014, 01:20
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por vangodp Ver Mensaje
Gracias a todos por sus ideas y ejemplos. (y)
Pues ahí va otro.

Y a fuerza de resultar pesado una última opción ligeramente más breve que la última que expuse :

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int f ( int num , int ultimoDigito ) {
  4.   if ( ultimoDigito > num ) return 1  ;
  5.   return ( ( (num ) % 10 ) >= ultimoDigito ? num % 10 : 1 ) * f ( num / 10 , ultimoDigito ) ;
  6. }
  7.  
  8. int main ( void ) {
  9.     int numero = 51258364  ;
  10.     printf ( "%d" , f ( numero , numero % 10 ) ) ;
  11.     return(0);
  12. }



¡¡¡Saluditos!!!

  #19 (permalink)  
Antiguo 13/11/2014, 09:38
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: funciones recursivas

Que artistas soys. De grande quiere ser como vosotros =3
  #20 (permalink)  
Antiguo 13/11/2014, 10:48
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: funciones recursivas

Desde luego yo me he quedado boquiabierto con las respuestas.
  #21 (permalink)  
Antiguo 14/11/2014, 01:30
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por dehm Ver Mensaje
Desde luego yo me he quedado boquiabierto con las respuestas.
Pues no se olviden de "picar" en "Este Mensaje me gusta".

¡¡¡Saluditos!!!

  #22 (permalink)  
Antiguo 14/11/2014, 02:56
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: funciones recursivas

Cierto. Por mi parte, ya fluye el karma por el hilo
  #23 (permalink)  
Antiguo 14/11/2014, 03:57
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 10 meses
Puntos: 49
Respuesta: funciones recursivas

Cita:
Iniciado por dehm Ver Mensaje
Cierto. Por mi parte, ya fluye el karma por el hilo
Gracias amigo dehm por elevar mi karma. vamos mi autoestima.


¡¡¡Saluditos!!!


Etiquetas: funcion, funciones, int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:29.