Анонимные функции, вызывающие себя в MATLAB

в качестве эксперимента (и потому, что я генерирую анонимные функции из пользовательских данных) я запустил следующий код MATLAB:

h = @(x) x * x
    h = @(x) x * x
h(3)
    ans = 9
h = @(x) h(x) + 1
    h = @(x)h(x)+1
h(3)
    ans = 10

в принципе, я сделал анонимный вызов функции. Вместо того чтобы действовать рекурсивно, MATLAB вспомнил старое определение функции. Однако рабочее пространство не показывает его как одну из переменных, и дескриптор, похоже, тоже не знает об этом.

будет ли старая функция храниться за кулисами, пока я сохраняю новую? Есть ли "готы" с такой конструкцией?

1 ответов


анонимная функция запоминает соответствующую часть рабочей области во время определения и делает ее копию. Таким образом, если вы включите переменную в определение анонимной функции и измените ее позже, она сохранит старое значение внутри анонимной функции.

>> a=1;
>> [email protected](x)x+a %# define an anonymous function
h = 
    @(x)x+a
>> h(1)
ans =
     2
>> a=2 %# change the variable
a =
     2
>> h(1)
ans =
     2 %# the anonymous function does not change
>> g = @()length(whos)
g = 
    @()length(whos)
>> g()
ans =
     0 %# the workspace copy of the anonymous function is empty
>> g = @()length(whos)+a
g = 
    @()length(whos)+a
>> g()
ans =
     3 %# now, there is something in the workspace (a is 2)
>> g = @()length(whos)+a*0
g = 
    @()length(whos)+a*0
>> g()
ans =
     1 %# matlab doesn't care whether it is necessary to remember the variable
>>