可以使用Func<>递归地呼唤自己?

时间:2009-11-20 15:36:48

标签: c# .net recursion

我正在玩一个去年出现的code golf question yesterday for building a christmas tree,我把一个快速的递归算法拼凑起来完成这项工作:

static string f(int n, int r)
{
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r)
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
}

我想知道我是否可以用Func做同样的事情:

Func<int,int,string> f = (n, r) => {
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r) 
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
};

这个完成这项工作,但递归部分不会识别对f的调用实际上是对自身的调用。这将使我得出结论,Func 不能递归地调用自己 - 但我想知道我是否得出错误的结论,或者是否可以做到但需要采用不同的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:15)

Func<int, int, string> f = null;
f = (x, y) => f(x, y);

显然这会导致StackOverflowException,但你明白了。

答案 1 :(得分:5)

请参阅this了解非常令人讨厌的递归lambda,固定点,Y组合器等。非常有趣的阅读。