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)
| | |-+  recursividad cruzada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: recursividad cruzada  (Leído 4,531 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: recursividad cruzada
« Respuesta #10 en: 13 Enero 2019, 11:03 am »

¿Os ensenan recursividad sin haber pasado todavía por todos los operadores?

Qué curioso.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: recursividad cruzada
« Respuesta #11 en: 13 Enero 2019, 11:11 am »

Mafus gracias,se nota que sabes programar avanzado pero es demasiado eso para mi, ajaajaj, hace de cuenta que le estas enseñando a un cavernicola, porque  usas sizeof?, y que significa --s?

Aunque ya tengas el tema solucionado, lo importante es resolver las dudas que quedan así que...
- <sizeof()> se usa para obtener el número de bytes que ocupa un tipo de dato. En ese código te devuelve el número de bytes que ocupa un <unsigned long long>.
- <--s> significa decrementar <s> en 1. Al igual que se suele hacer <i++>, se puede hacer también <i-->, <++i> o <--i>. A veces da igual usar el prefijo o el sufijo (cuando es una sentencia aislada, que no va como "encadenada"). El prefijo primero hace el incremento/decremento y después el resto de la sentencia; el sufijo primero hace el resto de la sentencia y al final hace el incremento/decremento.
Código
  1. for(int i = 0; i < 5; i++) // aqui da igual i++ o ++i porque esta solo
  2.    printf("%d", i++); // primero muestra i y luego lo incrementa en 1. Salida: 0, 2, 4
  3.  
  4. for(int i = 0; i < 5; i++)
  5.    printf("%d", ++i); // incrementa i y luego lo muestra. Salida: 1, 3, 5 (el 5 se muestra aunque la condicion es i < 5)



tampoco entiendo porque le pasas como parametro n>>1

Si haces <num >> 1> lo que haces es mover los bits de <num> una posición a la derecha. Si tienes:
a = 01011001
a >> 1
a = 00101100
Si el número es negativo se extiende con unos:
a = 11010011
a >> 1
a = 11101001

Como dato interesante que si no te paras a estudiar los bits no te das cuenta es que mover una posición a la izquierda un número en binario es equivalente a multiplicar ese número por 2. Y entonces moverlo una posición a la derecha es equivalente a dividirlo por 2, aunque si es impar se hará obviando los decimales.



Entonces para que entiendas el código ese que la verdad aunque poco efectivo, me parece impresionante:
Usa una función donde manda un <unsigned long long> que es el número a calcular y le pasa como segundo parámetro el número de bits que ocupa un número <unsigned long long> (con <sizeof()> saca el número de bytes y eso por 8, en bits).
Entonces cuando <s == 1> es decir, cuando sólo quede el bit más significativo se retorna ese bit (que valdrá 1 si el número es negativo o 0 si no lo es). Y si <s != 1>, mueve todos los bits una posición a la derecha y decrementa el número de bits que quedan todavía. Algo así en un caso simplificado:
n = 4 (0100) s = 4
s == 1? No -> n = 2 (0010) s = 3
s == 1? No -> n = 1 (0001) s = 2
s == 1? No -> n = 0 (0000) s = 1
s == 1? Si -> return n (return 0)

n = -2 (1110) s = 4
s == 1? No -> n = -1 (1111) s = 3 // los negativos se extienden con 1 para que sigan siendo negativos (cosas del complemento a 2)
s == 1? No -> n = -1 (1111) s = 2
s == 1? No -> n = -1 (1111) s = 1
s == 1? Si -> return n (return 1)



Una función de ese estilo es mejor que no muestre nada por pantalla por si quieres usar esa función dentro de un condicional, sería más funcional entonces sin los <printf()>:
Código
  1. int positivo(int n){
  2.    if(n >= 0)
  3.        return 1;
  4.    else
  5.        return !negativo(n);
  6. }
  7.  
  8. int negativo(int n){
  9.    if(n < 0)
  10.        return 1;
  11.    else
  12.        return !positivo(n);
  13. }

Espero que esto te ayude a entender y profundizar más en todo lo que se puede hacer con la programación. Suerte :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
fernaEDLP

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: recursividad cruzada
« Respuesta #12 en: 13 Enero 2019, 20:20 pm »

perdón creo que puse cualquier cosa ahí arriba, ahora creo que esta bien, igual es como muy secillo


Código
  1. void  negativo(int n);
  2. void  positivo(int n);
  3.  
  4.  
  5. int main()
  6. {
  7.    int N;
  8.    printf("ingrese el numero\n");
  9.    scanf("%d",&N);
  10.    positivo(N);
  11.    return 0;
  12. }
  13.  
  14. void positivo(int n)
  15. {
  16.    if(n>=0)
  17.    {
  18.        printf("el numero es positivo\n");
  19.    }
  20.    else
  21.    {
  22.       negativo(n);
  23.    }
  24. }
  25. void  negativo(int n)
  26. {
  27.    if(n<0)
  28.    {
  29.        printf("el numero es negativo\n");
  30.    }
  31.    else
  32.    {
  33.        positivo(n);
  34.    }
  35. }
  36.  
En línea

fernaEDLP

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: recursividad cruzada
« Respuesta #13 en: 13 Enero 2019, 20:24 pm »

perdon no habia entrado a la segunda pagina
En línea

fernaEDLP

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: recursividad cruzada
« Respuesta #14 en: 13 Enero 2019, 20:29 pm »

Aunque ya tengas el tema solucionado, lo importante es resolver las dudas que quedan así que...
- <sizeof()> se usa para obtener el número de bytes que ocupa un tipo de dato. En ese código te devuelve el número de bytes que ocupa un <unsigned long long>.
- <--s> significa decrementar <s> en 1. Al igual que se suele hacer <i++>, se puede hacer también <i-->, <++i> o <--i>. A veces da igual usar el prefijo o el sufijo (cuando es una sentencia aislada, que no va como "encadenada"). El prefijo primero hace el incremento/decremento y después el resto de la sentencia; el sufijo primero hace el resto de la sentencia y al final hace el incremento/decremento.
Código
  1. for(int i = 0; i < 5; i++) // aqui da igual i++ o ++i porque esta solo
  2.    printf("%d", i++); // primero muestra i y luego lo incrementa en 1. Salida: 0, 2, 4
  3.  
  4. for(int i = 0; i < 5; i++)
  5.    printf("%d", ++i); // incrementa i y luego lo muestra. Salida: 1, 3, 5 (el 5 se muestra aunque la condicion es i < 5)



Si haces <num >> 1> lo que haces es mover los bits de <num> una posición a la derecha. Si tienes:
a = 01011001
a >> 1
a = 00101100
Si el número es negativo se extiende con unos:
a = 11010011
a >> 1
a = 11101001

Como dato interesante que si no te paras a estudiar los bits no te das cuenta es que mover una posición a la izquierda un número en binario es equivalente a multiplicar ese número por 2. Y entonces moverlo una posición a la derecha es equivalente a dividirlo por 2, aunque si es impar se hará obviando los decimales.



Entonces para que entiendas el código ese que la verdad aunque poco efectivo, me parece impresionante:
Usa una función donde manda un <unsigned long long> que es el número a calcular y le pasa como segundo parámetro el número de bits que ocupa un número <unsigned long long> (con <sizeof()> saca el número de bytes y eso por 8, en bits).
Entonces cuando <s == 1> es decir, cuando sólo quede el bit más significativo se retorna ese bit (que valdrá 1 si el número es negativo o 0 si no lo es). Y si <s != 1>, mueve todos los bits una posición a la derecha y decrementa el número de bits que quedan todavía. Algo así en un caso simplificado:
n = 4 (0100) s = 4
s == 1? No -> n = 2 (0010) s = 3
s == 1? No -> n = 1 (0001) s = 2
s == 1? No -> n = 0 (0000) s = 1
s == 1? Si -> return n (return 0)

n = -2 (1110) s = 4
s == 1? No -> n = -1 (1111) s = 3 // los negativos se extienden con 1 para que sigan siendo negativos (cosas del complemento a 2)
s == 1? No -> n = -1 (1111) s = 2
s == 1? No -> n = -1 (1111) s = 1
s == 1? Si -> return n (return 1)



Una función de ese estilo es mejor que no muestre nada por pantalla por si quieres usar esa función dentro de un condicional, sería más funcional entonces sin los <printf()>:
Código
  1. int positivo(int n){
  2.    if(n >= 0)
  3.        return 1;
  4.    else
  5.        return !negativo(n);
  6. }
  7.  
  8. int negativo(int n){
  9.    if(n < 0)
  10.        return 1;
  11.    else
  12.        return !positivo(n);
  13. }

Espero que esto te ayude a entender y profundizar más en todo lo que se puede hacer con la programación. Suerte :-X

graciassss aja!, que lindo paseo me pegaron xD
En línea

fernaEDLP

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: recursividad cruzada
« Respuesta #15 en: 13 Enero 2019, 20:56 pm »

Por favor no se enojen conmigo, tengo una duda que a estas alturas va a ser estupida, pero cuando se retorna un 1 o un 0, dependiendo de si el usuario digita un negativo o un positivo, como te se da cuenta que el numero  es positivo o negativo?¿, no seria mejor que al evaluar la condición dentro del if, cuando chequea que es postivo avise mediante un printf que lo que se ingreso es postivo?, tenganme paciencia pliss :-*
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: recursividad cruzada
« Respuesta #16 en: 14 Enero 2019, 00:53 am »

Sí, pero esto es una forma de jugar con el lenguaje. Se prueban diferentes algoritmos sobre problemas de solución sencilla. Divertido, a la par que didáctico. Así cuando surjan problemas reales que necesiten de una solución parecida ya se tendrá experiencia para resolverlo.
En línea

fernaEDLP

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: recursividad cruzada
« Respuesta #17 en: 14 Enero 2019, 01:00 am »

perfecto gracias a todos!!
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: recursividad cruzada
« Respuesta #18 en: 14 Enero 2019, 19:54 pm »

Por favor no se enojen conmigo, tengo una duda que a estas alturas va a ser estupida, pero cuando se retorna un 1 o un 0, dependiendo de si el usuario digita un negativo o un positivo, como te se da cuenta que el numero  es positivo o negativo?¿, no seria mejor que al evaluar la condición dentro del if, cuando chequea que es postivo avise mediante un printf que lo que se ingreso es postivo?, tenganme paciencia pliss :-*

En programación, cuando hay dos posibles respuestas (si/no, verdadero/falso, etc) se traduce a una variable booleana (true/false). Las variables booleanas a veces se interpretan mejor como números (true = 1 / false = 0) y esto sirve para tener un abanico más grande de posibilidades para trabajar por ejemplo con condicionales.

El tema de retornar un 0/1 y no usar un <printf()> es por sencillez. Imagina un programa en el que usas esas funciones que has creado:
Código
  1. int main(){
  2.    // codigo
  3.    if(positivo(n)){
  4.        // codigo
  5.    }
  6.    // codigo
  7. }
Tú necesitas saber si <n> es positivo, pero no hace falta que le avises al usuario. Puede que tengas un programa muy grande donde haces miles de comprobaciones, el usuario no necesita ver cual es el resultado de cada comprobación.

Con el código que te mostré anteriormente puedes aprovechar lo que te he comentado de interpretar 1 = true y 0 = false para usar esas funciones en programas más grandes. Los posibles casos serían:
- n >= 0 -> positivo(n) retorna 1 (true) y negativo(n) retorna 0 (false)
- n < 0 -> positivo(n) retorna 0 (false) y negativo(n) retorna 1 (true)
Por eso por ejemplo en cada función se llama a la otra con el operador de negación(!). Para que los resultados que se obtienen con cada función sean los comentados arriba. Te dejo el código aquí por si quieres comprobarlo:
Código
  1. int positivo(int n){
  2.    if(n >= 0)
  3.        return 1;
  4.    else
  5.        return !negativo(n);
  6. }
  7.  
  8. int negativo(int n){
  9.    if(n < 0)
  10.        return 1;
  11.    else
  12.        return !positivo(n);
  13. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Facebook intensifica su cruzada contra los “Me gusta” falsos
Noticias
wolfbcn 1 2,137 Último mensaje 3 Septiembre 2012, 18:25 pm
por crazykenny
Mi primera cruzada contra un EXECryptor ? « 1 2 »
Ingeniería Inversa
TrashAmbishion 11 6,971 Último mensaje 6 Septiembre 2013, 05:04 am
por apuromafo CLS
Compilacion cruzada
Programación C/C++
engel lex 6 3,059 Último mensaje 21 Septiembre 2013, 19:11 pm
por engel lex
OPENCV imposible compilacion cruzada para ARM
GNU/Linux
cacaito 0 2,167 Último mensaje 18 Junio 2014, 17:35 pm
por cacaito
referencia cruzada de campos de una tabla en mysql
Desarrollo Web
iori100 0 2,555 Último mensaje 15 Enero 2018, 14:26 pm
por iori100
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines