sub ackermann_def {    my ($x, $y) = @_;    if($x == 0)    {        return ($y+1);    }    elsif($y == 0)    {        return ackermann_def($x-1, 1);    }    else    {        my $z = ackermann_def($x, $y-1);        return ackermann_def($x-1, $z);    } } sub ackermann_1rekursion {    my ($x, $y) = @_;    while(1)    {        if($x == 0)        {            return ($y+1);        }        elsif($y == 0)        {            $x--;            $y = 1;        }        else        {            $y = ackermann_1rekursion($x, $y-1);            $x--;        }    } } sub ackermann_0rekursion {    my ($x, $y) = @_;    my @stack = ();    while((defined $x and $x > 0) || ((scalar @stack) != 0))    {        if($x == 0)        {         $x = pop @stack;         $y++;        }        elsif($y == 0)        {         $y = 1;         $x--;        }        else        {         $y--;         push @stack, ($x-1);        }    }    return ($y + 1); }