Implementación de algoritmos de teoría de números/Función de Ackermann
Apariencia
La función de Ackermann es una función matemática recursiva encontrada en 1926 por Wilhelm Ackermann, tiene un crecimiento extremadamente rápido, de interés para la ciencia computacional teórica y la teoría de la computabilidad. Esta función toma dos números naturales como argumentos y devuelve un único número natural. Como norma general se define como sigue:
Implementación en distintos lenguajes de programación
[editar]Código en Java
[editar]public static int Ackermann(int m, int n)
{
if (m == 0)
return (n + 1);
else if (n == 0)
return (Ackermann(m - 1, 1));
else
return (Ackermann(m - 1, Ackermann(m, n - 1)));
}
Código en C
[editar]int ackermann(int m, int n)
{
if (m == 0)
return n + 1;
else if (n == 0)
return ackermann(m - 1, 1);
else
return ackermann(m - 1, ackermann(m, n - 1));
}
Código en Lisp
[editar](defun ackermann (m n)
(cond ((= m 0) (1+ n))
((= n 0) (ackermann (1- m) 1))
(t (ackermann (1- m)
(ackermann m (1- n))))))
Código en Haskell
[editar]ack 0 n = n + 1
ack m 0 = ack (m - 1) 1
ack m n = ack (m - 1) (ack m (n - 1))
Véase también: Haskell
Código en Prolog
[editar]ackermann(0,N,R):- R is N+1.
ackermann(M,0,R):- M1 is M-1,
ackermann(M1,1,R).
ackermann(M,N,R):- M1 is M-1,
N1 is N-1,
ackermann(M,R1,M1),
ackermann(M1,R1,R).
Código en Ada
[editar]function Ackermann (m, n : Integer) return Integer is
begin
if m = 0 then
return n + 1;
elsif m > 0 and n = 0 then
return Ackermann (m - 1, 1);
elsif m > 0 and n > 0 then
return Ackermann (m - 1, Ackermann (m, n - 1));
end if;
end Ackermann;
Código en Pascal
[editar]program funcion_de_ackermann; {compatible hasta el par(4,0)}
uses crt;
procedure leerpar(var m, n : Integer);
begin
writeln('Ingrese un numero: ');
readln(m);
writeln('Ingrese el otro numero: ');
readln(n);
end;
function ackermann(m, n : Integer) : LongInt;
begin
if m = 0 then
ackermann := n + 1
else if (m > 0) and (n = 0) then
ackermann := ackermann(m - 1, 1)
else if (m > 0) and (n > 0) then
ackermann := ackermann(m - 1, ackermann(m, n - 1));
end;
var m, n : Integer;
begin
clrscr;
leerpar(m,n);
writeln(ackermann(m, n));
readkey;
end.
Código en Python
[editar]def ackermann(n, m):
if n == 0:
return m + 1
elif m == 0:
return ackermann(n - 1,1)
else:
return ackermann(n - 1, ackermann(n, m - 1))
Véase también: Python
Código en Ruby
[editar]def ackermann(m, n)
return n + 1 if m == 0
return ackermann(m - 1, 1) if m > 0 && n == 0
return ackermann(m - 1, ackermann(m, n - 1)) if m > 0 && n > 0
end