SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: o.ficu en Domingo 18 de Octubre de 2009, 02:05

Título: Explicacion en recursividad
Publicado por: o.ficu en Domingo 18 de Octubre de 2009, 02:05
Hola, casi paresca un poco tonta mi pregunta pero en el siguiente programa que transforma un numero de base a base 2:
Código: C
  1. #include<iostream>
  2. #include<stdlib.h>
  3.  
  4. using namespace std;
  5. void binario(int n);
  6.  
  7.  
  8. int main()
  9. {    int n;
  10.      cout<<"Ingrese numero en base 10: ";
  11.      cin>>n;
  12.      cout<<"el numero en binario es: ";
  13.      binario(n);
  14.      system("PAUSE");
  15.      return 0;
  16. }
  17. void binario(int n)
  18. {  
  19.      if(n>0){
  20.              binario(n/2); // llama recursivamente a la funcion
  21.              cout<<n%2;}// aca es mi duda, por q imprime todos los digitos si el cout esta puesto cuando recien termina la ultima llamada a la funcion, por q imprime todos los digitos y no solo el ultimo?????
  22. }
  23.  
Gracias por u ayuda
Título: Re: Explicacion en recursividad
Publicado por: Eternal Idol en Domingo 18 de Octubre de 2009, 08:16
Supongamos que el numero es 5:

binario(5):
n es 5, mayor a 0 asi que llamamos a binario con 2
binario(2):
n es 2, mayor a 0 asi que llamamos a binario con 1
binario(1):
n es 1, mayor a 0 asi que llamamos a binario con 0
binario(0):
n es 0, no es mayor a 0 asi que aca empezamos a retonar a las anteriores funciones
binario(1):
n sigue siendo 1 y n%2 = 1, entonces imprime 1 y retorna
binario(2):
n sigue siendo 2 y n%2 = 0, entonces imprime 0 y retorna
binario(5):
n sigue siendo 5 y n%2 = 1, entonces imprime 1 y retorna

Volvemos al main.
Título: Re: Explicacion en recursividad
Publicado por: Geo en Domingo 18 de Octubre de 2009, 08:23
En la función binario, no solamente se tiene la llamada recursiva sino también una instrucción normal, la cual se debe ejecutar una vez haya concluido la recursividad, espero puedas visualizarlo con este ejemplo:

Suponiendo que el número ingresado sea 4

binario( 4 ), llamada dentro de la función main
4 > 0, se cumple, llama a binario
--binario( 4 / 2 ), binario se llama a si misma pasando 2 como argumento (4/2)
--2 > 0, se cumple, llama a binario
----binario( 2 / 2 ), binario se llama a si misma pasando 1 como argumento (2/2)
----1 > 0, se cumple, llama a binario
------binario( 1 / 2 ), binario se llama a si misma pasando 0 como argumento (1/2)
------0 > 0, no se cumple, volvemos al flujo del programa
------cout (1 % 2), después de llamar a binario(1/2) y retomar el flujo del programa, se llama a cout( 1%2)
----cout (2 % 2), después de llamar a binario(2/2) y retomar el flujo del programa, se llama a cout(2%2)
--cout (4 % 2), después de llamar a binario(4/2) y retomar el flujo del programa, se llama a cout(4%2)
se continúa con el programa

-----------------
Edición:
Je, Eternal Idol me ganó otra vez mientras escribía ;).
Título: Gracias!!
Publicado por: o.ficu en Domingo 18 de Octubre de 2009, 21:26
Muchas gracias, me esta gustando cada vez mas este foro XD
Título: Re: Explicacion en recursividad
Publicado por: Eternal Idol en Lunes 19 de Octubre de 2009, 05:47
De nadas  :lol: