2011-07-27 74 views
2

任何人都可以請解釋這段代碼的行爲(從http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx)。我不明白爲什麼它會顯示最後一次呼叫的18。匿名函數/遞歸在c#

Func<int, int> fib = null; 
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n; 
Func<int, int> fibCopy = fib; 
Console.WriteLine(fib(6));      // displays 8 
Console.WriteLine(fibCopy(6));     // displays 8 
fib = n => n * 2; 
Console.WriteLine(fib(6));      // displays 12 
Console.WriteLine(fibCopy(6));     // displays 18 

感謝

回答

2

因爲fibCopy仍然指向的fib最初的定義:n => n > 1 ? fib(n - 1) + fib(n - 2) : n;。在那個定義中,使用了fib。但fib已更改爲n => n * 2

執行fibCopy(6)將執行以下操作:

6 > 1 ? ((6-1) * 2) + ((6-2) * 2) : 6; 

因爲6大於1,三元表達的所述第一分支將被評估:

(6-1) * 2 = 10 
(6-2) * 2 = 8 
      --- 
      18 
+0

由於丹尼爾。這是一個解釋。 – umbersar