繁体   English   中英

递归匿名函数Matlab

[英]Recursive Anonymous Function Matlab

我知道这不是匿名函数的用途,但就像我试图通过匿名函数创建递归函数一样。 递归函数的原型显然是阶乘函数。 问题是,它是很难使匿名函数的情况区分。 到目前为止我设法做的是:

f=@(cn,n,f)eval('if n>1; f(cn*n,n-1,f);else;ans=cn;end');
f=@(n)f(1,n,f);

或者:

f=@(cn,n,f)eval('if n>1; f(cn*n,n-1,f);else;disp(cn);end');
f=@(n)f(1,n,f);

不太令人满意的是,在直接分配时仍然无法使用此功能, a=f(3)仍然会产生错误,因为eval没有得到值。

所以我的问题是,您是否可以通过匿名函数实际执行递归函数,例如以允许例如a=f(3)的方式计算阶乘,仅依赖于本机matlab函数(或者您可以在命令行中创建的函数,如我在我的例子中做过)?

PS:我知道这没有任何实际用途,这只是对你可以弯曲和滥用Matlab语法的挑战。

我们现在发现了两种可能性,都依赖于细胞阵列的使用。 请注意,这可能不适用于Octave。

关键是案例区分的实施。 我找到的第一个可以在这里找到

此方法使用matlabs布尔值,true可以计算为1而false可以计算为0

if_ = @( pred_, cond_ ) cond_{ 2 - pred_ }();

这里我们必须提供一个条件作为第一个参数,一个2元素单元格数组作为第二个参数。 每个单元格元素应该是一个函数句柄,如果条件为真/不为真,则调用该函数句柄。 我们的阶乘函数看起来像这样:

fac = @(n,f)if_(n>1,{@()n*f(n-1,f),@()1})
factorial_=@(n)fac(n,fac);
factorial_(10)

正如@AndrasDeak评论如下:这里的重要部分是我们有一个函数的单元格数组而不是 这提供了短路,由于n*f(n-1,f)不评估除非我们调用相应的功能@()n*f(n-1,f)

第二种方法是由@beaker发现的,并且更灵活一些:

iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

这利用了即使在匿名函数中也可以使用varargin (可变数量的参数)这一事实。 当你调用这个函数时,你必须交替条件,如果条件为真,应该执行什么。 这个甚至允许一个switch构造,或者if ... else if ... else if ... (...) else ...构造。 调用时,它将查找第一个为true的条件( find([varargin{1:2:end}], 1, 'first') )并调用相应的函数。 我们的阶乘函数示例如下所示:

fac = @(n,f)iif(n>1,@()n * f(n-1,f),true,@()1);
factorial_=@(n)fac(n,fac);
factorial_(10)

编辑:有趣的事实:我们正在做什么线

 factorial_=@(n)fac(n,fac);

也被称为应用Y-组合子 事实上,我们可以写为

 Y = @(f)@(x)f(x,f);
 factorial_=Y(f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM