Just for grins, I decided to code Ackerman's function in Perl.
The definition is really quite simple:
Formal Definition:
* A(0, j)=j+1 for j ≥ 0
* A(i, 0)=A(i-1, 1) for i > 0
* A(i, j)=A(i-1, A(i, j-1)) for i, j > 0
In my typical Brute Force and Ignorance™ method, I coded this:
#!perl use strict; use warnings; use bigint; my $value; my $m; my $n; if($#ARGV >= 1){ $m = shift(@ARGV); $n = shift(@ARGV); } elsif($#ARGV == 0){ $m = shift(@ARGV); $n = 0; } else{ $m = 0; $n = 0; } $value = ackermann($m, $n); print "ackermann( $m, $n ) is $value\n"; sub ackermann { (my $m, my $n) = @_; if($m == 0){ return $n+1; } elsif($m > 0 and $n == 0) { return ackermann($m - 1, 1); } elsif($m > 00 && $n > 0){ return ackermann($m-1, ackermann($m, $n-1)); } }
When run as ackermann 4 1, I get (many) 'deep recursion' messages.
OK; I know that my implementation is less than brilliant; that's not my question.
This is my question: Is there any way of predicting what conditions are likely to result in deep recursion messages?
Thanks to ikegami (I've got to try Memoize) and jdhedden.
emc
In reply to The Ackermann Function by swampyankee
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |