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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pequeña duda con funcion recursiva
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña duda con funcion recursiva  (Leído 4,952 veces)
CCross

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Pequeña duda con funcion recursiva
« en: 16 Mayo 2013, 00:56 am »

Hey!! buenas a todos los apasionados de esto de la programacion, me acabo de inscribir
en el foro. Yo soy unas de esas personas que cuando encuentra un codigo que no  
entiende, trata estudiar como funciona cada expresion, funcion etc;

En fin la cuestion es que me he topado con un codigo que me cuesta un poco comprenderlo
especificamente se trata de una funcion recursiva que lo que hace es convertir un un
numero decimal a binario miren esta es la funcion:

Código
  1. int binario(int dec)
  2. {
  3.    int resto = num % 2;
  4.    int divide = num / 2;
  5.  
  6.    return divide > 0 ? binario(divide) * 10 + resto : resto;
  7. }

Lo que llegue a entender es que si dvide es mayor que cero, se ejecuta la funcion
que luego es multiplicada por diez y se le suma uno. Por decirlo si yo le paso un siete
a la funcion, en un primer momento resto valdria 1 y divide seria 3 como ven
divide es mayor que cero, por lo que la funcion se ejecuta.

Lo mas logico es que la funcion binario(divide) retornara un cero que es
multiplicada por 10 que da 0 y luego se le suma 1 y asi sucesivamente en caso de que
divide no sea mayor que 0 se ejecuta el bloque correspondiente a false que le agrega
cero

Que me corrijan si esto no es asi saludos a todos  :rolleyes:
 


« Última modificación: 16 Mayo 2013, 03:12 am por CCross » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #1 en: 16 Mayo 2013, 10:15 am »

Creo que no es num sino dec.


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
CCross

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #2 en: 16 Mayo 2013, 15:42 pm »

Creo que no es num sino dec.

Si efectivamente habia cambia los parametros para que sea mas congruentes
me olvide hacer los cambios dentro jeje:.

Código
  1. int binario(int dec)
  2. {
  3.    int resto = dec % 2;
  4.    int divide = dec / 2;
  5.  
  6.    return divide > 0 ? binario(divide) * 10 + resto : resto;
  7. }

Y hiendo al tema que opinas estoy en lo corecto seria asi como funciona  o no¿?

Saludos
« Última modificación: 16 Mayo 2013, 15:45 pm por CCross » En línea

cypascal

Desconectado Desconectado

Mensajes: 42


Ver Perfil WWW
Re: Pequeña duda con funcion recursiva
« Respuesta #3 en: 16 Mayo 2013, 23:37 pm »

Hola, el fundamento de la función es que un número binario se puede calcular como:
Binario(x)=Binario(x/2)&(x%2)
Donde & indica concatenación, lo que en base decimal, también se puede conseguir multiplicando por 10 y sumando ambos.
Este método es el que te enseñan en la escuela, el de dividir el número por dos e irte quedando con los restos en orden contrario al que los calculaste. (En wikipedia si pones número binario sale)

Salu10
En línea

Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES
CCross

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #4 en: 17 Mayo 2013, 02:07 am »

Muchas gracias cypascal por la aclaracion, he buscado por internet
y he encontrado una funcion que hace esto de una menera mas simple:

Código
  1. void binario(int n)
  2. {
  3.    if (n!=0)
  4.    {
  5.        binario(n/2);
  6.        printf("%i",n%2);
  7.     }
  8. }

Esta divide el numero entre dos hasta que quede 0 y apunta a los residuos
del ultimo al primero. Los restos generados en cada division forman el
numero binario el primer resto es el bit menos significativo (LSB) y el
último resto es el bit mas significativo (MSB) del numero binario.

Código
  1. 10/2 = 05 con residuo 0 <--- LSB
  2. 05/2 = 02 con residuo 1
  3. 02/2 = 01 con residuo 0
  4. 01/2 = 00 con residuo 1 <--- MSB

Código
  1. Eso se imprimiria de esta forma 1010

En este caso segun entiendo la funcion printf imprime inversamente
los residuos resultante de la division, aprovecha esa propiedad de
imprimir el bit mas significativo primero y el LBS al ultimo siendo el
primero en originarse, podria alguien explicarme como esto es posible..

cypascal lo que entendi fue que al multiplicarlo por 10 consiste
una forma de ir ordenado los residuos de forma inversa seria algo asi no

Un saludo

 
« Última modificación: 17 Mayo 2013, 02:26 am por CCross » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #5 en: 17 Mayo 2013, 08:12 am »

sorry equivoqué el post
« Última modificación: 17 Mayo 2013, 11:54 am por leosansan » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #6 en: 17 Mayo 2013, 12:23 pm »


En este caso segun entiendo la funcion printf imprime inversamente
los residuos resultante de la division, aprovecha esa propiedad de
imprimir el bit mas significativo primero y el LBS al ultimo siendo el
primero en originarse, podria alguien explicarme como esto es posible..


Pues una forma es ir guardando en un array y luego imprimirlo al revés, o bien lo pasa a binario con la función "itoa":

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 100
  4.  
  5. int main()
  6. {
  7.    int j,num,num0,resto,i=0,binario[MAX],bin[MAX];
  8.    printf("Introduzca un numero : ");
  9.    scanf("%d",&num);
  10.    num0=num;
  11.    while(num>=1){
  12.        resto=num%2;
  13.        binario[i]=resto;
  14.        i++;
  15.        num=num/2;
  16.        printf("%d",resto);
  17.    }
  18.    puts("\n");
  19.    for (j=i-1;j>=0;j--)
  20.        printf("%d ",binario[j]);
  21.    itoa (num0,bin,2);
  22.    printf ("\n\n%d en binario: %s\n\n",num0,bin);
  23.    return 0;
  24. }
  25.  

Saluditos!. .... ..
En línea

CCross

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #7 en: 17 Mayo 2013, 20:40 pm »

Hola leosansan excelete codigo lo de itoa no lo sabia muy bueno pero aun
no logro enterder del todo este codigo:

Código
  1. return divide > 0 ? binario(divide) * 10 + resto : resto;

Especificamente en la parte de la multiplicacion por diez y luego la suma me
gustaria saber que valor devuelve la funcion de cada llama a ella yo supongo
que seria cero.

Saludos  :rolleyes:
« Última modificación: 17 Mayo 2013, 20:42 pm por CCross » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #8 en: 19 Mayo 2013, 13:53 pm »

Hola leosansan excelete codigo lo de itoa no lo sabia muy bueno pero aun
no logro enterder del todo este codigo:

Código
  1. return divide > 0 ? binario(divide) * 10 + resto : resto;

Especificamente en la parte de la multiplicacion por diez y luego la suma me gustaria saber que valor devuelve la funcion de cada llama a ella yo supongo que seria cero.


Es cuestión de "escribir" lo que va haciendo el código. Suelen ser peleonas las funciones recursivas y no muy eficientes.

Te dejo un par de casos para que veas como actúa. Observa que  devuelve los dígitos en orden correcto, no hay que darles la vuelta:


Citar

binario(11)=b(11)=
=10*b(5)+1=
=10*(10*b(2)+1)+1=100*b(2)+11=
=100*(10*b(1))+0)+11=1000*b(1)+11=
=1000*(1)+11=1011

binario(12)=b(12)=
=10*b(6)+0=
=10*(10*(b(3)+0)=100*b(3)=
=100*(10*b(1))+1)=1000*b(1)+100=
=1000*(1)+100=1100



Saluditos!. .... ...
« Última modificación: 19 Mayo 2013, 18:03 pm por leosansan » En línea

CCross

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Pequeña duda con funcion recursiva
« Respuesta #9 en: 19 Mayo 2013, 17:41 pm »

leosansan gracia por darte el tiempo de aclararme la duda que tenia, esto de la
recursividad esta complicadita. Y efectivamente una solucion recursiva generalmente
es menos eficiente por el consumo de mayor de recursos que la iterativa. Sin embargo en
muchas situacion nos puede facilitar las cosas.

Saludos..  ;D
« Última modificación: 19 Mayo 2013, 17:47 pm por CCross » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Función recursiva de búsqueda.
Programación C/C++
APOKLIPTICO 1 2,841 Último mensaje 4 Junio 2010, 21:51 pm
por [D4N93R]
Duda con función recursiva « 1 2 »
Programación C/C++
DickGumshoe 16 7,755 Último mensaje 8 Junio 2012, 05:02 am
por Ferno
pequeña duda sobre la funcion AddSecureMemoryCacheCallback
Programación C/C++
MRx86 2 2,061 Último mensaje 4 Octubre 2016, 21:37 pm
por MRx86
Pequeña duda con una función en MySQL
Programación General
jose_ank 0 2,038 Último mensaje 18 Febrero 2019, 13:51 pm
por jose_ank
duda función recursiva
Programación C/C++
fernaEDLP 4 1,994 Último mensaje 30 Mayo 2019, 20:55 pm
por fernaEDLP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines