hier mal meine 3 version der ackermann funktion (in lesbarer form):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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);
}
wie man sieht, macht eigentlich nur die zweite rekursion probleme!\n\n
<!--EDIT|esskar|1089805274-->