是否可以在MATLAB中使用递归匿名函数?

San*_*ses 3 matlab functional-programming anonymous-function

我一再想要应用一个函数,使用过去的输出作为新输入.为了便于阅读(我从数学的角度来看,而不是程序员的观点),我想将它定义为一个简单的匿名函数而不是一个完整的函数块.所以,而不是像

function f=myfun(x,n)
    if n>1
        f=myfun(myfun(x,n-1),1);
    else
        f=expression(x);
    end
end
Run Code Online (Sandbox Code Playgroud)

我想能写

f=@(x,n) ????
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

Sue*_*ver 8

在MATLAB中使用递归匿名函数的唯一方法是将函数句柄作为输入传递给自身.然后,您可以从匿名函数中调用它.

%// The first input f is going to be an anonymous function
myfun = @(f,x,n) f(f, x, n+1);

%// Then use your anonymous function like this (note the first input)
out = myfun(myfun, x, n);
Run Code Online (Sandbox Code Playgroud)

由于您没有任何分支逻辑,这显然会导致无限递归.如果要模拟分支逻辑,则需要实现另一个匿名函数来执行此操作(iif此处借用的函数):

%// Anonymous function to simulate if/elseif/else
iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

%// Your anonymous function that is recursive AND has branching
myfun = @(f,x,n)iif(n > 1, ...                      % if n > 1
                    @()f(f, f(f, x, n-1), 1), ...   % Recurse
                    true, ...                       % else
                    @()expression(x));              % Execute expression()
Run Code Online (Sandbox Code Playgroud)

Mathworks网站上有一系列非常可靠的博客条目,它们使用匿名函数来完成这种函数式编程.

一句警告

虽然这是一个有趣的练习,但如果您希望任何人轻松理解您的代码,我绝对不会建议使用它.调试标准函数要清晰得多,也更容易.然后,如果您确实需要匿名函数,请在匿名函数中包含对该函数的调用.

myanonfunc = @(varargin)myfunc(varargin{:});
Run Code Online (Sandbox Code Playgroud)

或者只是为函数创建一个函数句柄

myfunchandle = @myfunc;
Run Code Online (Sandbox Code Playgroud)