Editando apunte: Desafío javascript: 100! cerrar apuntes
ID: 97 (tabla: apuntes)

Vicisitudes de un Webmaster, Programación
javascript, webmaster
javascript, webmaster
- - - - - - - -

[rss]Para obtener el resultado nos hemos basado en la técnica usada en un antiguo desafío: "Fibo(1000): códigos y comentarios." donde los resultados intermedios se han ido guardando en cadenas de texto.[/rss]

A continuación ponemos el código que hemos usado:

function factorial(n)	{

	function revés(cadena)	{
	/*
		arreglo = cadena.split("");
		resultado = "";
		while (arreglo.length > 0) resultado += arreglo.pop();
		return resultado;
	*/
		return cadena.split("").reverse().join("");
	}

	function f(x){
		_resultado = "1";
		for (i = 2; i <= x; i++)	{
			_acumulado = "";
			_sumar = 0;
			for (j = 0; j < _resultado.length; j++)	{
				_digito = "0123456789".charAt(_resultado[j]) * i + _sumar;
				_resto = _digito % 10;
				_sumar = parseInt(_digito / 10);
				_acumulado += _resto.toString();
			}
			if (_sumar > 0) _acumulado += revés(_sumar.toString());
			_resultado = _acumulado;
		}
		return revés(_resultado);
	}
	if (n == 1)	return n
//	else	return n * factorial(n - 1);
	else	return f(n);
}

Puede notarse que nos hemos ayudado de dos funciones auxiliares donde evidentemente "f()" es la verdadera solución del problema; y se ayuda de otra que invierte las cadenas de texto.

Revés de una cadena

Para ir acumulando los valores intermedios hemos hecho una simple concatenación, pero debido a que al insertar valores al final de la misma, tuvimos que ingeniárnosla para invertir luego el resultado.

[rss]En el código que hemos llamado "revés", al no existir una primitiva para invertir los datos tipo String, nos hemos ayudado de algunas primitivas del tipo Array.[/rss]


[rss]Veremos si el código propuesto puede ser mejorado...[/rss]

Controles Otras tablas: imagenes, postales, categorias, etiquetas, extras - - () - que Seleccionar nuevo apunte