xref: /inferno-os/appl/math/ack.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Ackermann;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsythinclude "draw.m";
6*37da2899SCharles.Forsyth	draw: Draw;
7*37da2899SCharles.Forsyth
8*37da2899SCharles.ForsythAckermann: module
9*37da2899SCharles.Forsyth{
10*37da2899SCharles.Forsyth        init: fn(ctxt: ref Draw->Context, argv: list of string);
11*37da2899SCharles.Forsyth};
12*37da2899SCharles.Forsyth
13*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
14*37da2899SCharles.Forsyth{
15*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
16*37da2899SCharles.Forsyth	draw = load Draw Draw->PATH;
17*37da2899SCharles.Forsyth	argv = tl argv;		# remove program name
18*37da2899SCharles.Forsyth	m := n := 0;
19*37da2899SCharles.Forsyth	if(argv != nil){
20*37da2899SCharles.Forsyth		m = int hd argv;
21*37da2899SCharles.Forsyth		argv = tl argv;
22*37da2899SCharles.Forsyth	}
23*37da2899SCharles.Forsyth	if(m < 0)
24*37da2899SCharles.Forsyth		m = 0;
25*37da2899SCharles.Forsyth	if(argv != nil)
26*37da2899SCharles.Forsyth		n = int hd argv;
27*37da2899SCharles.Forsyth	if(n < 0)
28*37da2899SCharles.Forsyth		n = 0;
29*37da2899SCharles.Forsyth	t0 := sys->millisec();
30*37da2899SCharles.Forsyth	a := ack(m, n);
31*37da2899SCharles.Forsyth	t1 := sys->millisec();
32*37da2899SCharles.Forsyth	sys->print("A(%d, %d) = %d (t = %d ms)\n", m, n, a, t1-t0);
33*37da2899SCharles.Forsyth}
34*37da2899SCharles.Forsyth
35*37da2899SCharles.Forsythack(m, n: int) : int
36*37da2899SCharles.Forsyth{
37*37da2899SCharles.Forsyth        if(m == 0)
38*37da2899SCharles.Forsyth                return n+1;
39*37da2899SCharles.Forsyth        else if(n == 0)
40*37da2899SCharles.Forsyth                return ack(m-1, 1);
41*37da2899SCharles.Forsyth        else
42*37da2899SCharles.Forsyth                return ack(m-1, ack(m, n-1));
43*37da2899SCharles.Forsyth}
44