2011-07-27 78 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