以下代码无法编译:
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);
首先需要创建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以来,你终于可以使用本地函数代替lambda来做类似的事情。
int fac(int n) => (n <= 1) ? 1 : n * fac(n - 1);