2009-11-20 82 views
6

我玩弄它出現在去年圍繞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://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas? – 2009-11-20 16:56:17

回答

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

顯然這會導致StackOverflowException,但你明白了。

+0

關於StackOverflowException的好評。 – 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

5

請參閱this非常遞歸lambdas,固定點,Y-combinators等的怪異覆蓋。非常有趣的閱讀。

+1

非常有趣的閱讀 - 但它傷害了我的頭:P – BenAlabaster 2009-11-20 15:51:25