matlab 利用函数的递归调用计算 n,关于递归:递归匿名函数Matlab

博客讨论了如何在MATLAB中使用匿名函数(lambda函数)实现递归,特别是阶乘函数。作者遇到的问题在于MATLAB的匿名函数在变量区分和赋值时的限制。提出了两种解决方案,一种是使用if_函数,另一种是利用varargin和iif函数。这两种方法都涉及到单元格数组的使用以避免提前求值。尽管这在实际应用中可能并无必要,但对于MATLAB语法的探索和理解具有一定的价值。
摘要由CSDN通过智能技术生成

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

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语法的挑战。

你的意思是匿名功能吗?函数句柄对我来说似乎是一类更广泛的对象。但我不是专家,所以我真的在问。

@AndrasDeak我当然知道,谢谢你指出这一点!

目前没有Matlab访问权限,但您是否尝试过这样的'if n>1; f(cn*n,n-1,f); else; cn; end?

@patrik我做了,它没有帮助:)问题是如果你只是调用f(3)它将执行if...并且一切都很好。但是如果你想分配a=f(3),它想要做类似a= if...的事情。我们非常需要matlab中的条件三元运算符;)

这可能会有所帮助。

我想我刚刚找到了我要找的东西,这里提供的if_功能,谢谢你们无论如何帮忙,我一直在寻找这个!我只需要弄清楚如何在我的阶乘示例中使用它=)

如果你得到满意的解决方案,一定要发一个答案:)

@beaker:这不仅有用,还包含一个包含解释的完整解决方案。

@AndrasDeak我现在做了!

另请参阅@Sanchises的这个新问题。

我们现在发现了两种可能性,都依赖于细胞阵列的使用。请注意,这可能不适用于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 ...构造。调用时,它将查找第一个为真的条件(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);

我建议在两种情况下都强调需要@()来保护论证免于评估。 例如,当您调用mean(rand(3))时,matlab首先计算rand(3),然后将该矩阵传递给mean函数。 如果省略@()部分,iif将尝试评估当时无意义的函数。 要点:iif函数似乎在第一个true参数处短路,但事实并非如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值