函数可以递归地调用自己吗?
我玩弄它出现在去年围绕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 不能递归调用自己 - 但我不知道我是否得出错误的结论,或者如果它可以完成,但需要不同的方法。
任何想法?
Func<int, int, string> f = null;
f = (x, y) => f(x, y);
显然这会导致*Exception,但你明白了。
关于*Exception的好评。 – 2009-11-20 15:40:15
哈哈 - 我明白了。这太糟糕了,尽管你不能在一行中完成。谢谢。 – BenAlabaster 2009-11-20 15:41:05
现货上。 Ben的代码与'int i = i + 1'的原因是非法的。 另请注意,f的代码块可以重新分配f的值,这将是钝的,但是完全合法。 – 2009-11-20 15:41:38
请参阅this为非常递归lambdas,固定点,Y-combinators等的怪异覆盖。非常有趣的阅读。
非常有趣的阅读 - 但它伤害了我的头:P – BenAlabaster 2009-11-20 15:51:25
相同http://*.com/questions/1079164/c-recursive-functions-with-lambdas? – 2009-11-20 16:56:17