[英]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.