swampyankee has asked for the wisdom of the Perl Monks concerning the following question:
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: The Ackermann Function
by ikegami (Patriarch) on Jun 20, 2006 at 17:20 UTC | |
by ikegami (Patriarch) on Jun 20, 2006 at 19:01 UTC | |
|
Re: The Ackermann Function
by NateTut (Deacon) on Jun 20, 2006 at 20:35 UTC | |
by swampyankee (Parson) on Jun 21, 2006 at 19:17 UTC | |
|
Re: The Ackermann Function
by jdhedden (Deacon) on Jun 20, 2006 at 17:23 UTC | |
|
Re: The Ackermann Function
by Moron (Curate) on Jun 20, 2006 at 17:35 UTC | |
by gjb (Vicar) on Jun 20, 2006 at 19:26 UTC | |
by NetWallah (Canon) on Jun 21, 2006 at 01:28 UTC |