And*_*ech 27 c# recursion lambda factorial
以下不编译:
Func<int, int> fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Run Code Online (Sandbox Code Playgroud)
在访问之前,可能不会初始化局部变量'fac'
你怎么能用lambdas做一个递归函数?
[更新]
这里还有两个我觉得有趣的链接:
Jar*_*Par 45
C#不支持这种特殊的函数样式作为单行声明.您必须将声明和定义分为2行
Func<int, int> fac = null;
fac = n => (n <= 1) ? 1 : n * fac(n - 1);
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 15
那么geez,如果你只是输入"为什么递归lambda导致明确的赋值错误?" 在一些搜索引擎中,你已经在我关于这个主题的文章中找到了答案.
:-)
Dar*_*rio 11
你必须先创建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));
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这可能有点难以阅读/理解.