将方法体中定义的阶乘函数视为lambda表达式并分配给变量:
Func<int, int> factfail = n =>
{
if (n == 0)
return 1;
else
return n * factfail(n-1);
};
这失败了,因为factfail
还没有被局部变量绑定。
有没有办法添加一种修复点 - 通过抽象函数本身?!
Func<Func<int, int>, int, int> fact_ = (fact, n) =>
{
if (n == 0)
return 1;
else
return n * fact(n-1);
};
fact_(??);
长篇故事: 我需要编写一个递归函数,它具有改变某些外部状态的副作用。 因此,我试图将该方法编写为捕获该外部状态的lambda表达式。
我仍在尝试不同的样式如何编写它 - 除了那个字典需要对所有递归调用都相同 - 我希望尽可能纯粹功能和懒惰。
所以我在玩LINQ,因为它可以帮助我减少相互数据。 它还有助于理解代码的哪些部分可以用函数式表达。
在LINQ语句中简要介绍一下,能够在前面定义一些辅助函数是有帮助的,我通过将lambda表达式绑定到变量来做到这一点。
使用lamda表达式我也可以捕获我的字典,而不需要明确地传递它对方法的引用,这是非常好的。
不确定我是否在正确的轨道上......
答案 0 :(得分:3)
您可以通过Mads Torgersen在this blog post中找到有关递归lambda表达式的更多信息。他展示了如何定义通常的定点组合器。他使用阶乘函数作为示例,因此您可以在那里找到您的确切样本: - )。
但是,在实践中,您只需定义一个本地Func<..>
变量,然后进行变异即可。如果你想给代表命名,那么它的工作正常(它有点脏,但很简单):
Func<int, int> fact = null;
fact = (n) => (n == 0) ? 1 : n * fact(n-1);
这是有效的,因为闭包捕获对fact
变量的引用,所以当你实际调用它时(在递归调用期间),该值不再是null
,而是引用委托。< / p>