Implementación de algoritmos de teoría de números/Factorial

De Wikilibros, la colección de libros de texto de contenido libre.

La función factorial es formalmente definida mediante el producto

.

La multiplicación anterior se puede simbolizar también utilizando el operador productorio:

.

También es posible definirlo mediante la relación de recurrencia

En este caso hay una sucesión recurrente, el cálculo sucesivo de sus elementos se llama proceso recurrente y la igualdad n! = (n - 1)!n se nombra ecuación recurrente.

Implementación en distintos lenguajes de programación[editar]

La función factorial es fácilmente implementable en distintos lenguajes de programación. Se pueden elegir dos métodos, el iterativo, es decir, realiza un bucle en el que se multiplica una variable temporal por cada número natural entre 1 y n, o el recursivo, por el cual la función factorial se llama a sí misma con un argumento cada vez menor hasta llegar al caso base 0!=1.

Implementación en C[editar]

Iterativa[editar]

unsigned int factorial( unsigned int n ) { 
 
    int resultado, i;
 
    resultado = 1;
    for ( i = 1 ; i <= n ; ++i )
        resultado = resultado * i;
 
    return resultado;
}

Recursiva[editar]

// Factorial en C99 - implementación recursiva
unsigned int factorial(unsigned int n) {
    if (n > 0)
        return n * factorial(n-1);
    else return 1;
}
// Uso
printf("%u", factorial(5));
// 120

En Visual Basic .NET[editar]

Dim N As Integer ' Valor dado
Dim C As Integer 'Contador
Dim R As Double ' Resultado
Console.WriteLine("Introduzca un número entero")
N = CInt(Console.ReadLine())
C = 0
R = 1
Do While C < N
   C += 1
   R = C * R
Loop
Console.WriteLine(R)

En Pascal[editar]

! Factorial en Pascal por medio de una función.
Program factoriales;
Var
	j,m:integer;

function factorial(n:integer):integer;
Var
	i,a:integer;
Begin
	a:=1;
	for i:=1 to (n) do
	begin
		a:=a*i;
	end;
	factorial:=a;
end;

Begin
	writeln('Ingrese el numero maximo');
	readln(m);
	for j:=1 to m do
	writeln(j,' y su factorial es: ',factorial(j));
	readln(m);
end.

En Fortran[editar]

! Factorial en Fortran 90 - implementación iterativa
function factorial(n)
    integer, intent(in) :: n
    integer :: factorial
    integer :: i
    factorial = 1
    do i = 2, n
        factorial = factorial * i
    end do
end function
! Uso
write (*,*) factorial(5)
! 120

En Python[editar]

# Factorial en python como implementación recursiva.
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)
# Uso
print factorial(5)
# 120


# Factorial sin usar recursión
def factorial(n):
    aux = 1
    for i in range(n):
        aux *= (i+1)
    return aux
# Uso
print factorial(5)
# 120

En Java[editar]

class ClaseFactorial {
   public static long factorial(long n) {		//Con recursividad
      return n == 0 ? 1 : n * factorial(n - 1);
   }

   //Uso
   public static void main(String[] args) {
	System.out.println(factorial(5));
   }
}

En Javascript[editar]

var numero = prompt ("insertar numero");
var resultado = numero;
for (var i=1 ; i < numero; i++)
{resultado *= i}
alert (resultado)

En Haskell[editar]

fact n = product [1 .. n]

En Transact-SQL[editar]

Haciendo uso de una Expresión de Tabla Común (CTE):

declare @n bigint
set @n = 20;
with TablaFactoriales as (
  select
    convert(bigint, 0) as n
  , convert(bigint, 1) as factorial
  union all
  select
    n + 1
  , factorial * (n + 1)
  from TablaFactoriales
  where n < @n
)
select n, factorial from TablaFactoriales

En Scheme[editar]

(define (! c)
  (if (even? c)
      (let loop ((n c) (i (- c 2)) (f 1))
        (if (>= i 0)
            (loop (+ n i) (- i 2) (* f n))
            f))
      (* c (! (- c 1)))))