Autor Tema: [RETO] calcular factorial  (Leído 21370 veces)

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
[RETO] calcular factorial
« en: 25 de Agosto de 2011, 21:28:04 pm »
hola! la idea es crear una función como por ejemplo factorial($n);, y que devuelva el factorial de n (n!)

A ver quien hace el procedimiento más rápido!! :D


El factorial de 3 es 1*2*3, el de 5 es 1*2*3*4*5... etc

NOTA EXTRA:
he pensado en limitar el número que se pase por input, la función solo procesa números del 0 al 15
« Última modificación: 25 de Agosto de 2011, 22:53:51 pm por good »

Comunidad PHPeros

[RETO] calcular factorial
« en: 25 de Agosto de 2011, 21:28:04 pm »

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #1 en: 25 de Agosto de 2011, 21:52:48 pm »
Hola Good!

Suponiendo que estamos hablando de PHP (El tema lo has publicado en retos pero no especificas la categoría exactamente) voy a elaborar este código, hace tiempo que no programo, puede que esté algo oxidado pero lo voy a intentar.

miarchivo.php

<?php
	
function 
n($n){
	
	
$operacion 1;

	
	
	
for(
$i=1$i <= $n$i++){
	
	
	
	
$operacion $operacion*$i;
	

	
	
	
}

	
	
return 
$operacion;
}

echo 
n($_GET[&#39;n&#39;]);
?>


Si por ejemplo, vamos a miarchivo.php?num=5 hará la operación 1*2*3*4*5 cuyo resultado es 120. La verdad es que es un script sencillo pero como hace tiempo que no programo pues me ha costado un poco pensar el algoritmo jaja.

Un saludo,
Siquillote.
« Última modificación: 25 de Agosto de 2011, 22:01:54 pm por Siquillote »

#Fdo. Physlet

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #2 en: 25 de Agosto de 2011, 21:57:55 pm »
vale, pero no es lo suficientemente rápido, se puede optimizar!

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #3 en: 25 de Agosto de 2011, 22:01:15 pm »

vale, pero no es lo suficientemente rápido, se puede optimizar!

Hola Good,

La verdad no entiendo porque dices que no es lo suficientemente rápido... a mi ni me tarda milésimas. En cuanto a que dices que se puede optimizar yo creo que es "imposible". Se utilizan los métodos exactos y concisos, ni mas ni menos. Hombre, se podría simplificar quitando la función pero como tu pedías una función...

Un saludo,
Siquillote.

#Fdo. Physlet

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #4 en: 25 de Agosto de 2011, 22:05:25 pm »
Hola Good,

La verdad no entiendo porque dices que no es lo suficientemente rápido... a mi ni me tarda milésimas. En cuanto a que dices que se puede optimizar yo creo que es "imposible". Se utilizan los métodos exactos y concisos, ni mas ni menos. Hombre, se podría simplificar quitando la función pero como tu pedías una función...

Un saludo,
Siquillote.

hay una manera de hacerlo más eficiente. Éste que has hecho funciona bien, sí, pero siempre tiene que realizar el cálculo completo, por ejemplo, si lo probaras así:

factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);
factorial (1000);

seguramente no sería tan rápido xD

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #5 en: 25 de Agosto de 2011, 22:08:31 pm »

Hola Good,

Verás, la cosa del reto (según a mi entender) es crear una función que elabore ese algoritmo no hacer que si a partir de X numero vaya mas rápido o lento o si llamas a la funcion 80 veces en tu script, ¿No crees?.

Un saludo,
Ángel.

#Fdo. Physlet

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #6 en: 25 de Agosto de 2011, 22:10:02 pm »
Hola Good,

Verás, la cosa del reto (según a mi entender) es crear una función que elabore ese algoritmo no hacer que si a partir de X numero vaya mas rápido o lento o si llamas a la funcion 80 veces en tu script, ¿No crees?.

Un saludo,
Ángel.

el reto es buscar la solución más rápida y eficiente, es un problema en el que se tiene en cuenta la eficiencia (velocidad) del proceso para cualquier caso (llamar solo una vez a la función o llamarla tantas veces como sea necesario)

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[RETO] calcular factorial
« Respuesta #7 en: 25 de Agosto de 2011, 22:12:33 pm »
function factorial($numero){
	

	
for(
$i $numero-1$i 0$i--)
	
	
$numero *= $i;
	

	
return 
$numero;
}

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #8 en: 25 de Agosto de 2011, 22:17:51 pm »

el reto es buscar la solución más rápida y eficiente, es un problema en el que se tiene en cuenta la eficiencia (velocidad) del proceso para cualquier caso (llamar solo una vez a la función o llamarla tantas veces como sea necesario)

Hola Good,

Verás, no se si llegas a entenderme bien. A lo que yo voy es a decirte que por muy "eficaz" y rápida crees una función dará igual si la llamas 5000 veces. La función no sabe cuantas veces la está llamando por lo tanto no se puede hacer nada respecto a ello.

function factorial($numero){
	

	
for(
$i $numero-1$i 0$i--)
	
	
$numero *= $i;
	

	
return 
$numero;
}


Si, visto de esa forma si que es mas corto de elaborar. Bien visto así Physlet, enhorabuena.

Un saludo,
Siquillote.

#Fdo. Physlet

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #9 en: 25 de Agosto de 2011, 22:19:01 pm »
Hola Good,

Verás, no se si llegas a entenderme bien. A lo que yo voy es a decirte que por muy "eficaz" y rápida crees una función dará igual si la llamas 5000 veces. La función no sabe cuantas veces la está llamando por lo tanto no se puede hacer nada respecto a ello.

Si, visto de esa forma si que es mas corto de elaborar. Bien visto así Physlet, enhorabuena.

Un saludo,
Siquillote.

sigue siendo "ineficiente" en cuestión de rapidez

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[RETO] calcular factorial
« Respuesta #10 en: 25 de Agosto de 2011, 22:20:04 pm »
Si, visto de esa forma si que es mas corto de elaborar. Bien visto así Physlet, enhorabuena.
Un saludo,
Siquillote.
La forma más eficiente –según creo– es usando recursividad. En breve lo subo.

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #11 en: 25 de Agosto de 2011, 22:22:07 pm »
La forma más eficiente –según creo– es usando recursividad. En breve lo subo.

He actualizado el enunciado

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:[RETO] calcular factorial
« Respuesta #12 en: 25 de Agosto de 2011, 22:23:00 pm »
La más eficiente sin tu último requerimiento sería esta:

function factorial ($numero){
	
return 
$numero == $numero $numero factorial($numero 1);
}

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #13 en: 25 de Agosto de 2011, 22:23:27 pm »
La forma más eficiente –según creo– es usando recursividad. En breve lo subo.

Como no sabía a que te referías a recursividad he googleado un poco y me encontrado esto. Creo que esa podría ser la solución a este reto.

La más eficiente sin tu último requerimiento sería esta:

function factorial ($numero){
	
return 
$numero == $numero $numero factorial($numero 1);
}


EDIT: Physlet, he ido a comprobar la funcionalidad del algoritmo y no funciona.

Un saludo,
Siquillote
« Última modificación: 25 de Agosto de 2011, 22:25:43 pm por Siquillote »

#Fdo. Physlet

Desconectado good

  • PHPerit@
  • *
  • Mensajes: 49
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:[RETO] calcular factorial
« Respuesta #14 en: 25 de Agosto de 2011, 22:25:51 pm »
La más eficiente sin tu último requerimiento sería esta:

function factorial ($numero){
	
return 
$numero == $numero $numero factorial($numero 1);
}


esta solución tardaría lo mismo que la anterior, puedes optimizar este mismo código para que sea mucho más eficiente
« Última modificación: 25 de Agosto de 2011, 22:27:54 pm por good »