I defined a function in Mathematica. It is a function of n, so f[n_]:=, but in the definition, I used a sum, $\sum_{k=0}^n$. So, the $k$ is just an index variable for the sum and no $k$ shows up in the final answer. As I was using this function I tried evaluating f[k-1] and got a weird answer, 0. I finally figured out that Mathematica was trying to do the sum $\sum_{k=0}^{k-1}$, or so I guess. So, my question is, is there a way to make the $k$ local so that this error never occurs? My fix for now was to change $k$ to $index$ and I will probably not use f[index] at any point.
Asked
Active
Viewed 4,486 times
8
3 Answers
7
The function you are looking for is called Module
. You can define it as
f[n_] := Module[{k}, Sum[a[k], {k,0,n}]]
so that the evaluation f[k-1]
is possible.

LightninBolt74
- 166

Fabian
- 23,360
7
Block
might be better than Module
-- when you use recursion, a local variable defined in Module
will be shared across stack frames, Block
will have a separate version of the variable in each call

Yaroslav Bulatov
- 5,327
-
-
@Fabian Why not? I tried your snippet in Mathematica 8 and replacing
Module
withBlock
makes no difference – Yaroslav Bulatov Mar 25 '11 at 17:31 -
defining g[n_]:=Block[{k},Sum[Binomial[n,k],{k,0,n}] and then executing g[k-1] gives a result different from 0? (then they must have changed something going to version 8) – Fabian Mar 25 '11 at 18:22
-
1@Fabian I was too hasty, you are right, it doesn't work for that example, another approach might be to use
Unique
– Yaroslav Bulatov Mar 25 '11 at 19:49
3
An alternative to Module
or Block
is to use Formal Symbols. This allows for the cleanest code.
One may still run into trouble depending on how you choose to use Formal symbols elsewhere, but if you never use \[FormalK]
in the argument to f
you are safe.

Mr.Wizard
- 802
Sum
function. However, $k$ is still $k$ so thatg[k-1]
translates intoSum[Binomial[k-1,k],{k,0,k-1}]
which will evaluate to 0 (because Binomial[k-1,k]=0). What you want is that the summation index gets a different name and therefore you needModule
. WithModule
theg[k-1]
is effectively translated intoSum[Binomial[k-1,k$],{k$,0,k-1}]
. – Fabian Mar 24 '11 at 22:32g[n_] := Sum[Binomial[n, k], {k, 0, n}]
, the result ofg[k-1]
is2^(-1+k)
, which is correct. – whuber Mar 25 '11 at 02:35Remove[k]
, I get the correct result. (c) Protecting g with eitherBlock
orModule
makes it work correctly. Clearly, then, the help statement is not entirely correct. – whuber Mar 25 '11 at 02:52