• Domingo 17 de Noviembre de 2024, 21:23

Autor Tema:  Explicacion A Este Codigo  (Leído 1940 veces)

cybergatita

  • Miembro MUY activo
  • ***
  • Mensajes: 154
    • Ver Perfil
Explicacion A Este Codigo
« en: Miércoles 7 de Junio de 2006, 23:32 »
0
Que tal chicos, me podrian apoyar a interpretar este codigo. en si la funcion de factorial.

como es obvio aun soy algo novata en la logica.


gracias chicos


#include <stdio.h>

float factorial(float N) {

if (N == 0) return 1;

else return N*factorial(N-1);
        }


main () {

float N;
       
                printf("\n CALCULO DE FACTORIALES \n");
                printf("\nIntroduzca un numero entero:\n");
               
                scanf("%f", &N);
       
                        printf("\El Factorial es %f", factorial(N));
                        exit(0);
}

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Explicacion A Este Codigo
« Respuesta #1 en: Miércoles 7 de Junio de 2006, 23:48 »
0
float factorial(float N) {

if (N == 0) return 1;

else return N*factorial(N-1);
}

es una funcion recursiva. se llama a si misma.
como toda funcion recursiva tiene una conficion de corte porque sino se seguiria llamando y agotaria la memoria.

por ejemplo si la llamamos con el parametro 2, la funcion se llama a si misma con el parametro 1 que se llama a si misma con el parametro cero, la condicion
if (N == 0) return 1; devuelve uno entonces la que lo habia llamado devuelve 1 * 1 y la que la habia llamado devuelve 2 * ( 1 * 1 )

http://es.wikipedia.org/wiki/Recursividad

robbie110487

  • Miembro activo
  • **
  • Mensajes: 66
    • Ver Perfil
Re: Explicacion A Este Codigo
« Respuesta #2 en: Jueves 8 de Junio de 2006, 00:00 »
0
Claro que si cybregatita, antes nada debes entender que es el factorial de un numero, se puede definir  como el producto de todos los números naturales anteriores o iguales a él. Se escribe n!, y se lee "n factorial". (Por definición el factorial de 0 es 1: 0!=1)

Código: Text
  1. #include&#60;stdio.h&#62;  //Libreria para printf() y scanf()
  2. #include&#60;stdlib.h&#62;  //Libreria para system()
  3.  
  4. /**Funcion factorial, recibe un entero con punto flotante*/
  5. float factorial(float N)
  6. {
  7.     if (N == 0) return 1;  //Si N es igual a 0 retorna el numero 1
  8.                            //(porque el factorial de 0 es 1)
  9. else                         //de lo contrario
  10.     //retorna la multiplicacion de N por el factorial de N-1
  11.     //Si te fijas la funcion es llamada hasta que el factorial se igual a 0 o
  12.     //mejor dicho a 1
  13.     return N*factorial(N-1);  
  14. }
  15.  
  16.  
  17. /*Funcion principal*/
  18. int main ()
  19. {
  20.     float N;
  21.     printf(&#34;&#092;n CALCULO DE FACTORIALES &#092;n&#34;);
  22.     printf(&#34;&#092;nIntroduzca un numero entero:&#092;n&#34;);
  23.     scanf(&#34;%f&#34;, &N);  //Aqui se pide el numero
  24.     printf(&#34;&#092;El Factorial es %f&#34;, factorial(N)); //Aqui se llama a la funcion
  25.     system(&#34;pause&#34;); //lo agregue para hacer una pausa
  26.     return(0);   //lo modifique porque no me compilaba
  27. }
  28.  

Cualquier duda postea  :hola:

Pd. lo modifique un poco, pero en si sigue siendo el mismo codigo :)

cybergatita

  • Miembro MUY activo
  • ***
  • Mensajes: 154
    • Ver Perfil
Re: Explicacion A Este Codigo
« Respuesta #3 en: Jueves 8 de Junio de 2006, 00:04 »
0
De antemano gracias chicos.

lo de un numero factorial si lo entiendo, y bueno ya entendi mas de esa función.
aunque lo razonare un poco mas para ver si me surgen dudas, por que ahorita tengo varias pero no se como explicarselas o decirlas :S.


Saludos y gracias por estas dos respuestas

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Explicacion A Este Codigo
« Respuesta #4 en: Jueves 8 de Junio de 2006, 07:56 »
0
:P
Toma en cuenta lon siguiente:


Peligros en la recursividad
El principal peligro al usar recursividad, es no tener una manera de salir del paso recursivo, esto es peligroso porque se hacen llamadas a la misma función, lo que significa una entrada en la pila donde se almacenan los estados generales del programa.

Para decidir hacer un programa recursivo se deben de tener al menos dos cosas muy claras:


El paso base: Esta es la clave para terminar la recursión, es cuando deja de hacer llamadas a la función recursiva y hace evaluaciones devolviendo los resultados. En el ejemplo de la serie de Fibonacci, el paso base está en la línea ( 5). Además se debe asegurar de que es posible entrar a este paso.
El paso recursivo: Es la parte de la definición que hace llamadas a esa misma función y que es la causante de las inserciones en la pila, almacenando en cada una de las llamadas, información del programa, del estado de sus variables locales y globales. En el mismo ejemplo de la serie Fibonacci, el paso recursivo se muestra en la línea ( 7).
Otras cosas que se deben tener claras son por ejemplo si se pasa una variable como referencia o por valor, si las variables apuntadores son del tipo adecuado etc.

Frecuentemente tanto el paso base como el paso recursivo, se encuentran en una sentencia condicional if, pero porsupuesto que es posible usar cualquier otra sentencia de control, dependiendo de las necesidades particulares del problema.

El siguiente ejemplo ilustra este problema


( 1) #include <iostream>
( 2) int malaFuncion( int n ){
( 3)    std::cout << "malaFuncion es una recursion infinita. n="<<n;
( 4)    if( n == 0 )
( 5)       return 0;
( 6)    else
( 7)       return malaFuncion( n / 3 + 1 ) + n - 1;
( 8) }
( 9) int main (int argc, char * const argv[]) {
(10)     std::cout << malaFuncion(10);
(11)     return 0;
(12) }
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]