2011-07-27 25 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が使用されます。しかしfibn => 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