函数可以递归地调用自己吗?

问题描述:

我玩弄它出现在去年围绕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 不能递归调用自己 - 但我不知道我是否得出错误的结论,或者如果它可以完成,但需要不同的方法。

任何想法?

+0

相同http://*.com/questions/1079164/c-recursive-functions-with-lambdas? – 2009-11-20 16:56:17

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

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

+0

关于*Exception的好评。 – 2009-11-20 15:40:15

+1

哈哈 - 我明白了。这太糟糕了,尽管你不能在一行中完成。谢谢。 – BenAlabaster 2009-11-20 15:41:05

+1

现货上。 Ben的代码与'int i = i + 1'的原因是非法的。 另请注意,f的代码块可以重新分配f的值,这将是钝的,但是完全合法。 – 2009-11-20 15:41:38

请参阅this非常递归lambdas,固定点,Y-combinators等的怪异覆盖。非常有趣的阅读。

+1

非常有趣的阅读 - 但它伤害了我的头:P – BenAlabaster 2009-11-20 15:51:25