Implementación de algoritmos de teoría de números/Función de Ackermann

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