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.
Answer
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
Address OP question
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}
Comments
Post a Comment