summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x017/ch1.pl37
1 files changed, 37 insertions, 0 deletions
diff --git a/017/ch1.pl b/017/ch1.pl
new file mode 100755
index 0000000..6a79051
--- /dev/null
+++ b/017/ch1.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/env perl
+#
+# Create a script to demonstrate Ackermann function. The Ackermann function is
+# defined as below, m and n are positive number:
+#
+# A(m, n) = n + 1 if m = 0
+# A(m, n) = A(m - 1, 1) if m > 0 and n = 0
+# A(m, n) = A(m - 1, A(m, n - 1)) if m > 0 and n > 0
+#
+# Example expansions as shown in wiki page.
+#
+# A(1, 2) = A(0, A(1, 1))
+# = A(0, A(0, A(1, 0)))
+# = A(0, A(0, A(0, 1)))
+# = A(0, A(0, 2))
+# = A(0, 3)
+# = 4
+#
+# (https://en.wikipedia.org/wiki/Ackermann_function).
+################################################################################
+
+use strict;
+use warnings;
+
+use Memoize;
+
+memoize "ack";
+
+sub ack {
+ my ($m, $n) = @_;
+ return $n+1 if $m == 0;
+ return ack($m-1, 1) if $n == 0;
+ return ack($m-1, ack($m, $n-1));
+}
+
+@ARGV == 2 || die "Usage: $0 <m> <n>\n";
+print ack(@ARGV), "\n";