7
$\begingroup$

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.

  • 1
    @Numth Thank you. I double-checked and was able to reproduce your results. (a) After quitting all kernels and re-evaluating the definition of g, I obtain zero for g[k-1]. (b) After issuing `Remove[k]`, I get the correct result. (c) Protecting g with either `Block` or `Module` makes it work correctly. Clearly, then, the help statement is not entirely correct.2011-03-25

3 Answers 3

6

The function you are looking for is called Module. So you can define f[n_]:=Module[{k},Sum[a[k],{k,0,n}] and then the evaluation f[k-1] is possible.

  • 0
    That is perfect, thanks!2011-03-24
6

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

  • 1
    @Fabian I was too hasty, you are right, it doesn't work for that example, another approach might be to use `Unique`2011-03-25
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.