6 votes

Fonctions anonymes s'appelant elles-mêmes dans MATLAB

À titre expérimental (et parce que je génère des fonctions anonymes à partir de données utilisateur), j'ai exécuté le code MATLAB suivant :

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

En gros, j'ai fait en sorte qu'une fonction anonyme s'appelle elle-même. Au lieu d'agir de manière récursive, MATLAB s'est souvenu de l'ancienne définition de fonction. Cependant, l'espace de travail ne l'affiche pas comme l'une des variables, et le handle ne semble pas le savoir non plus.

L'ancienne fonction sera-t-elle conservée en arrière-plan tant que je conserverai la nouvelle ? Existe-t-il des problèmes avec ce type de construction ?

8voto

Jonas Points 54073

Une fonction anonyme se souvient de la partie pertinente de l'espace de travail au moment de la définition, et en fait une copie. Ainsi, si vous incluez une variable dans la définition de la fonction anonyme, et que vous modifiez cette variable plus tard, l'ancienne valeur sera conservée dans la fonction anonyme.

>> a=1;
>> h=@(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
>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X