2
$\begingroup$

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.

$\endgroup$
16
  • 2
    $\begingroup$ 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. $\endgroup$ Nov 1, 2018 at 23:27
  • $\begingroup$ Could you please show how I should use Set in this case? $\endgroup$
    – mavzolej
    Nov 1, 2018 at 23:28
  • $\begingroup$ this returns 4 and f[] , not 4 and 2 $\endgroup$
    – ZaMoC
    Nov 1, 2018 at 23:28
  • $\begingroup$ Sorry! I have fixed. $\endgroup$
    – mavzolej
    Nov 1, 2018 at 23:29
  • 1
    $\begingroup$ Kinda like in the documentation: f[x_] = x/n; (not :=) $\endgroup$ Nov 1, 2018 at 23:37

1 Answer 1

4
$\begingroup$

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}

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.