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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Factorial de un Número : duda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Factorial de un Número : duda  (Leído 3,555 veces)
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Factorial de un Número : duda
« 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.



  


« Última modificación: 8 Enero 2022, 18:42 pm por snoopty » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Factorial de un Número : duda
« Respuesta #1 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.


En línea

snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Factorial de un Número : duda
« Respuesta #2 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 !
« Última modificación: 10 Enero 2022, 12:49 pm por snoopty » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Factorial de un Número : duda
« Respuesta #3 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. }
En línea

snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Factorial de un Número : duda
« Respuesta #4 en: 16 Enero 2022, 01:22 am »

Gracias x responder; pero en dónde " haría agua " mi ejemplo ?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Factorial de un Número : duda
« Respuesta #5 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á.
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular el factorial de un numero [Batch]
Scripting
leogtz 0 14,107 Último mensaje 10 Abril 2009, 20:11 pm
por leogtz
[C]Factorial de un numero
Programación C/C++
HRSLASH 5 5,695 Último mensaje 9 Agosto 2010, 23:04 pm
por leogtz
Factorial de un numero!
Programación C/C++
barnix456 3 3,339 Último mensaje 12 Mayo 2012, 17:00 pm
por barnix456
Ayuda - Funcion factorial de un numero
Programación C/C++
Miky Gonzalez 9 6,381 Último mensaje 30 Junio 2012, 20:09 pm
por leogtz
Error al hacer la factorial de un numero en C
Programación C/C++
diegofah 2 2,797 Último mensaje 6 Septiembre 2013, 16:49 pm
por ecfisa
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines