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?


added in edit

Thanks to ikegami (I've got to try Memoize) and jdhedden.

emc

e(π√−1) = −1

In reply to The Ackermann Function by swampyankee

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.