Re: Part specification... is neither an integer nor a
- To: mathgroup at smc.vnet.net
- Subject: [mg109705] Re: Part specification... is neither an integer nor a
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Wed, 12 May 2010 07:35:57 -0400 (EDT)
Add memory to the definition
Clear[g]
g[0] = 0;
g[n_] := g[n] = n - g[g[n - 1]];
g /@ Range[0, 10]
{0,1,1,2,3,3,4,4,5,6,6}
?? g
Bob Hanlon
---- Chandler May <cjmay4754 at gmail.com> wrote:
=============
Hi Mathematica sages,
I want to implement a recursive function on the natural numbers:
g(n) = n - g(g(n-1))
g(0) = 0
First I tried the following in Mathematica.
g[0] := 0
g[n_] := n - g[g[n-1]]
This worked, but it was much too slow. In hopes of reducing the
number computations, I thought I would make a function gseq[n_] to
generate the sequence of successive values of g(n) like so:
gseq[0] := {0}
gseq[n_] := With[{s=gseq[n-1]}, Append[s, n - s[[Last[s]]]]]
However, when I ask for gseq[n] for n > 1, Mathematica complains that
the "Part specification... is neither an integer nor a list of
integers", like the first line here
<http://reference.wolfram.com/mathematica/ref/message/General/pspec.html>
(sorry, I don't have Mathematica in front of me at the moment).
gseq[1] gives me something like {0, 1 - List}.
What exactly is going wrong, and how do I mend it? Also, in the With
construct, will gseq[n-1] be evaluated once and stored in s, or will
every instance of s be replaced by a call to gseq[n-1] (so that
gseq[n-1] is wastefully evaluated three times per call to gseq[n])?
If gseq[n-1] will be evaluated more than once (per call to gseq[n]),
is there a way to change the code so that it won't be? If there's a
better way to efficiently implement g(n) altogether, please share (but
please don't reveal any mathematical properties about the particular
function g(n)--don't spoil my fun).
Thanks,
Chandler