C#:使用 Lambda 的递归函数
题
以下内容无法编译:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
访问之前,本地变量“ FAC”可能不会初始化
如何使用 lambda 来创建递归函数?
[更新]
这里还有两个我觉得有趣的链接:
解决方案
C# 不支持这种特殊风格的函数作为单行声明。您必须将声明和定义分成两行
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
其他提示
好吧,如果您刚刚键入“为什么递归lambda会导致明确的分配错误?”在一些搜索引擎中,您会在我的文章中找到有关该主题的答案。
:-)
你必须创建 fac
首先并稍后分配它(这是非常无功能的,因为它取决于多重分配)或使用所谓的 Y-combinators
.
例子:
delegate Func<TIn, TOut> FixedPointFunction<TIn, TOut>(Func<TIn, TOut> f);
static Func<T, TRes> Fix<T, TRes>(FixedPointFunction<T, TRes> f) {
return f(x => Fix(f)(x));
}
static void Main(string[] args) {
var fact = Fix<int, int>(f => x => (x <= 1) ? x : x * f(x - 1));
Console.WriteLine(fact(5));
}
但请注意,这可能有点难以阅读/理解。
自从 c# 7.0 你终于 能 使用 a 在一行中执行此操作 局部功能
int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);
不隶属于 StackOverflow