【问题标题】:Is it possible to have a recursive anonymous function in MATLAB? [duplicate]MATLAB中是否可以有递归匿名函数? [复制]
【发布时间】:2016-03-30 13:42:55
【问题描述】:

我反复想应用一个函数,使用过去的输出作为新的输入。为了可读性(我是从数学的角度而不是程序员的角度来写的),我想将它定义为一个简单的匿名函数而不是一个完整的函数块。所以,而不是像

function f=myfun(x,n)
    if n>1
        f=myfun(myfun(x,n-1),1);
    else
        f=expression(x);
    end
end

我希望能够写作

f=@(x,n) ????

有什么办法可以做到吗?

【问题讨论】:

标签: matlab functional-programming anonymous-function


【解决方案1】:

在 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);

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

%// 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()

在 Mathworks 网站上有一个真正的 solid series of blog entries,它使用匿名函数进行了这种函数式编程。

注意事项

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

myanonfunc = @(varargin)myfunc(varargin{:});

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

myfunchandle = @myfunc;

【讨论】:

  • @sanchises 我所知道的执行分支逻辑的唯一方法是第二种方法。我绝对不鼓励在 MATLAB 中进行这种函数式编程,并且会坚持使用标准函数,因为它肯定会损害可读性。不过,这些博客条目绝对很有趣。
  • 是的 - 非常感谢,我不会将它用于我目前正在做的事情,但它当然值得考虑用于其他项目。
  • @sanchises 我已经更新了。有一个小错误,但它现在应该复制原始函数的输出。
  • 我在 ppcg 上使用了你的答案:codegolf.stackexchange.com/a/137547/32352,这可能是为了打高尔夫球 :)
猜你喜欢
  • 2015-11-21
  • 2022-01-19
  • 2022-06-10
  • 1970-01-01
  • 2022-06-20
  • 2011-10-26
  • 2011-01-29
  • 2011-04-22
  • 2020-09-24
相关资源
最近更新 更多