Very true. I was executing the large Int-based examples on a 64 bit 
machine. <br>
<br>You can of course flip over to Integer on either 32 or 64 bit machines 
and alleviate the problem with undetected overflow. Of course that doesn&#39;t help with negative initial inputs <br>;)<br>
<br>I do agree It is still probably a good idea to either filter the negative case like you do here, or, since it is well defined, extend the scope of the memo table to the full Int range by explicitly memoizing negative vales as well.<br>
<br>-Edward Kmett<br><br><div class="gmail_quote">On Fri, Jul 9, 2010 at 11:51 AM, Mike Dillon <span dir="ltr">&lt;<a href="mailto:mike@embody.org">mike@embody.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
begin Edward Kmett quotation:<br>
<div class="im">&gt; The result is considerably faster:<br>
&gt;<br>
&gt;     *Main&gt; fastest_f 12380192300<br>
&gt;     67652175206<br>
&gt;<br>
&gt;     *Main&gt; fastest_f 12793129379123<br>
&gt;     120695231674999<br>
<br>
</div>I just thought I&#39;d point out that running with these particular values<br>
on a machine with a 32 bit Int will cause your machine to go deep into<br>
swap... Anything constant greater that maxBound is being wrapped back to<br>
the negative side, causing havoc to ensue. I changed the open version of<br>
&quot;f&quot; to look like this to exclude negative values:<br>
<div class="im"><br>
        f :: (Int -&gt; Int) -&gt; Int -&gt; Int<br>
        f mf 0             = 0<br>
</div>        f mf n | n &lt; 0     = error $ &quot;Invalid n value: &quot; ++ show n<br>
        f mf n | otherwise = max n $ mf (div n 2) +<br>
<div><div></div><div class="h5">                                                                 mf (div n 3) +<br>
                                                                 mf (div n 4)<br>
<br>
</div></div><font color="#888888">-md<br>
</font></blockquote></div><br>