Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: snoopty en 8 Enero 2022, 18:28 pm



Título: Factorial de un Número : duda
Publicado por: snoopty en 8 Enero 2022, 18:28 pm
Hola ! Quisiera saber si es correcto que el sgte. código ( en el caso de calcular el factorial de 5 )
tiene 4 ( y no 5 ) Iteraciones ; pues pienso que " factorial = 1 x 1 " no sería la 1er Iteración,
ya que es un cálculo donde se están multiplicando dos Variables inicializadas en 1 ; pienso que
aún no comenzó " i " a incrementarse, por eso no sería una Iteración.
Sé que es algo contradictorio lo que digo, pues en " factorial = factorial x 1 " ,  el 2do factorial necesita munirse de ese " 1 con que fue inicializado " en la 1er Iteración para que comience a funcionar ++i;
sino, ¿ de dónde obtiene el primer uno el 2do factorial de la fórmula para ejecutar ( lo que yo
considero que es ) la 1er Iteración ??


Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main( )
  5. {
  6.  
  7. int numero;
  8.  
  9. int factorial = 1; // Se inicializa en " 1 " para que no dé siempre " 0 "
  10.  
  11.  
  12. cout << "\n\tIngrese el Numero cuyo FACTORIAL desea calcular : ";
  13. cin >> numero;
  14.  
  15.  
  16.  
  17. for ( int i = 1; i <= numero; i++ )
  18. {
  19.  
  20. factorial = factorial * i;
  21.  
  22. }
  23.  
  24. /*
  25.  
  26. Para 5!       =     V    A    R  ("acumulador")     ( i )
  27.                      factorial     de la VAR
  28.                                    factorial
  29.  
  30. Antes de i++  :     factorial   =      1       *      1      =>    factorial = 1    =>
  31.  
  32. 1er Iteración :     factorial   =      1       *      2      =>    factorial = 2    =>
  33.  
  34. 2da Iteración :     factorial   =      2       *      3      =>    factorial = 6    =>
  35.  
  36. 3er Iteración :     factorial   =      6       *      4      =>    factorial = 24   =>
  37.  
  38. 4ta Iteración :     factorial   =     24       *      5      =>    factorial = 120
  39.  
  40. */
  41.  
  42. cout << "\n\tEl FACTORIAL de " << numero << " es : " << factorial << endl;
  43.  
  44. return 0 ;
  45. }

Gracias x leer el mensaje.



  


Título: Re: Factorial de un Número : duda
Publicado por: Serapis en 9 Enero 2022, 00:08 am
Has iniciado factorial a 1, si fuera 0, cualquier multiplicación posterior daría 0.
Si i=1, la primera iteración (te guste o no) es esa, i=1.
Otra cosa es que resulte superfluo multiplicar factorial por 1.Pues 1x1 = 1.
Ergo, puedes inicializar el bucle con i=2 (siempre que 'numero' fuere mayor que 1).

Código:
Si (numero > 0)
   factorial =1
   si (numero > 1)
       ... calcular empezando con i=2
   fin si
fin si

devolver factorial

...de hecho tu código fallará si se introduce para numero un valor menor que 1.


Título: Re: Factorial de un Número : duda
Publicado por: snoopty en 10 Enero 2022, 12:35 pm
Entiendo perfectamente lo que decís; pero .... supongamos que un Colectivo es "  Trasladado flamente directamente desde la Fábrica - donde se le provee de nafta, aceite, etc. y de un Conductor -  mediante un Remolque hasta la Estación ' 1 '  ";
y a ese ' Trasladado '  lo denomino  ' Inicializado en UNO '  :
Mientras esté en ' 1 ' está quieto; recién cuando arranca ( vale decir " comienza a iterar ? " ) la iteración comenzará : y pasará por las Estaciones 2, 3, 4 y 5; y lo hará en 4 tramos ( podría yo decir 4 iteraciones ? ) = 1era Desde 1 hasta 2, 2da Desde 2 hasta 3, 3era desde 3 hasta 4 ..... y 4ta desde 4 hasta 5.
Porqué esto que argumeno no sería válido ? Saludos !


Título: Re: Factorial de un Número : duda
Publicado por: MAFUS en 10 Enero 2022, 16:37 pm
Siendo sinónimos ejecución de un bucle e iteración de un bucle está claro que no es lo mismo que repetición.

Ejemplo trivial.
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. int ejecuciones = 1;
  5. int repeticiones = 0;
  6.  
  7. while(ejecuciones <= 5) {
  8. printf("Esta es la %da iteración de este bucle, repetición %d\n", ejecuciones, repeticiones);
  9. ejecuciones++;
  10. repeticiones++;
  11. }
  12. }


Título: Re: Factorial de un Número : duda
Publicado por: snoopty en 16 Enero 2022, 01:22 am
Gracias x responder; pero en dónde " haría agua " mi ejemplo ?


Título: Re: Factorial de un Número : duda
Publicado por: K-YreX en 16 Enero 2022, 13:32 pm
Este tema tenía que llamarse: "Hacer complicado lo simple"  :xD

Empezamos por decir que una iteración es cada una de las repeticiones de un proceso.
Partiendo de eso, cuántas iteraciones tiene calcular el factorial de 5 o cualquier otro proceso? Pues las que tu algoritmo defina. Un mismo problema se puede solucionar con diferentes algoritmos que varíen el número de iteraciones para resolverlo.

Creo que se explica más fácil con código:
Código
  1. for(int i = 0; i < 0; ++i); // Este bucle no se va a ejecutar nunca. Iteraciones = 0
  2. for(int i = 0; i < 1; ++i); // Este bucle se va a ejecutar 1 vez: i = {0}. Iteraciones = 1
  3. for(int i = 0; i < num; ++i); // Este bucle se va a ejecutar num-veces si num >= 0 y 0-veces si num < 0. Iteraciones = MAX(0, num)
  4.  
  5. // Y si i no empieza en 0, todo funciona igual
  6. for(int i = 10; i < 15; ++i); // Este bucle se va a ejecutar 5 veces: i = {10, 11, 12, 13, 14}. Iteraciones = 5
  7.  
  8. // De forma general:
  9. for(int i = a; i < b1; ++i); // Este bucle se va a repetir (b1-a) veces o 0 si el resultado es negativo (como antes). Iteraciones = MAX(0, (b1-a))
  10. // Y teniendo en cuenta que el anterior bucle es igual a:
  11. for(int i = a; i <= b1-1; ++i); // Iteraciones: MAX(0, (b1-a)) = MAX(0, (b1-1-a+1))
  12.  
  13. // Consideramos que b2 = b1-1 y juntamos conclusiones:
  14. for(int i = a; i <= b2; ++i); // Iteraciones: MAX(0, (b2-a+1))

Y ahí tenemos cómo calcular el número de iteraciones de un bucle de forma general tanto cuando el comparador es '<' o '<='.

Ahora vamos al código original:
Citar
Código
  1. for ( int i = 1; i <= numero; i++ ) {
  2.  factorial = factorial * i;
  3. }
Cuántas iteraciones realiza? MAX(0, (numero-1+1)) = MAX(0, numero)
Es decir: numero-iteraciones si numero >= 0 o 0 en caso contrario -> numero = 5 -> El programa realiza 5 iteraciones, no hay más.

Que la primera iteración no tiene sentido porque el 1 es el elemento neutro de la multiplicación y entonces multiplicar por 1 es como no hacer nada? Efectivamente, pero ese programa realiza 5 iteraciones.
Si consideras que la primera no es necesaria y realizas la siguiente modificación:
Código
  1. for(int i = 2; i <= numero; ++i) {
  2.  factorial *= i; // Forma corta de escribir: factorial = factorial * i
  3. }
Ahora, cuántas iteraciones realiza este bucle? MAX(0, (numero-2+1)) = MAX(0, (numero-1)) -> numero = 5 -> MAX(0, (5-1)) = MAX(0, 4) = 4 iteraciones

Todo depende de cómo se implemente el algoritmo no de "yo considero que esta no cuenta". Si consideras que algo no cuenta pero tu programa lo está haciendo, entonces cuenta. Si no quieres que cuente, haz que tu programa no lo haga y entonces no contará.