41 lines
1.1 KiB
Plaintext
41 lines
1.1 KiB
Plaintext
$ include "seed7_05.s7i";
|
|
include "bigint.s7i";
|
|
|
|
const func bigInteger: ackermann (in bigInteger: m, in bigInteger: n) is func
|
|
result
|
|
var bigInteger: ackermann is 0_;
|
|
begin
|
|
case m of
|
|
when {0_}: ackermann := succ(n);
|
|
when {1_}: ackermann := n + 2_;
|
|
when {2_}: ackermann := 3_ + 2_ * n;
|
|
when {3_}: ackermann := 5_ + 8_ * pred(2_ ** ord(n));
|
|
otherwise:
|
|
if n = 0_ then
|
|
ackermann := ackermann(pred(m), 1_);
|
|
else
|
|
ackermann := ackermann(pred(m), ackermann(m, pred(n)));
|
|
end if;
|
|
end case;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
var bigInteger: m is 0_;
|
|
var bigInteger: n is 0_;
|
|
var string: stri is "";
|
|
begin
|
|
for m range 0_ to 3_ do
|
|
for n range 0_ to 9_ do
|
|
writeln("A(" <& m <& ", " <& n <& ") = " <& ackermann(m, n));
|
|
end for;
|
|
end for;
|
|
writeln("A(4, 0) = " <& ackermann(4_, 0_));
|
|
writeln("A(4, 1) = " <& ackermann(4_, 1_));
|
|
stri := str(ackermann(4_, 2_));
|
|
writeln("A(4, 2) = (" <& length(stri) <& " digits)");
|
|
writeln(stri[1 len 80]);
|
|
writeln("...");
|
|
writeln(stri[length(stri) - 79 ..]);
|
|
end func;
|