# Using the value of the variable in the definition of the function [closed]

How do I take the current value of n in the second line in order for the answers to be the same in both cases?

n = 2;
f[x_] := x/n;
Print[f[8]];
n = 4;
Print[f[8]];


Now:

4
2


Want:

4
4


Basically, I want the function to be x/2 after my definition. (Please don't suggest defining it as x/2, I need to define a list of functions inside the cycle.)

UPDATE

The question I asked looks oversimplified, so suggested solutions do not really work for me. Here is a more realistic example.

I want to create a list of functions, each acting on a complicated argument:

ft = {};
For[n = 1, n <= 3, n++,
tmp[x_] := x[[1]]/n;
AppendTo[ft, tmp];
];
ft[[1]][{12, 1}]
ft[[2]][{12, 1}]
ft[[3]][{12, 1}]


The generated output is

3
3
3


The desired output is:

12
6
4


I cannot replace := with = since this produces an error.

• Either use Set instead of SetDelayed (so that it will immediately evaluate f[x] to be x/2), or else make n part of the argument list to f. Commented Nov 1, 2018 at 23:27
• Could you please show how I should use Set in this case? Commented Nov 1, 2018 at 23:28
• this returns 4 and f[] , not 4 and 2 Commented Nov 1, 2018 at 23:28
• Sorry! I have fixed. Commented Nov 1, 2018 at 23:29
• Kinda like in the documentation: f[x_] = x/n; (not :=) Commented Nov 1, 2018 at 23:37

First, it is much better to use Table to construct a list instead of using For and AppendTo. Second, in order to inject the value of n into your function definition, you need to use With. Finally, instead of defining tmp 3 times (so that each definition overrides the previous definition), you can define tmp[n] 3 times. Putting this together we have:

ft = Table[
With[{n=n},
tmp[n][x_] := x[[1]]/n;
tmp[n]
],
{n, 3}
]

ft[[1]][{12,1}]
ft[[2]][{12,1}]
ft[[3]][{12,1}]


{tmp[1], tmp[2], tmp[3]}

12

6

4

When you use SetDelayed, this means that the RHS is not evaluated when the definition is created. Example:

n=3;
f[x_] := x/n
DownValues[f]


{HoldPattern[f[x_]] :> x/n}

Notice how the definition has n instead of 3. In order to get the value of n inserted into your definition you need to use Set (although there are many cases where you can't use Set) or you need to use a method to insert the value of n, a common one being With:

With[{n = 3},
f[x_] := x/n
];
DownValues[f]


{HoldPattern[f[x$$_]] :> x$$/3}

• Amazing, thanks! Could you please clarify what exactly does {n=n} inside With gives us in this case? Commented Nov 2, 2018 at 1:33