2011-07-27 6 views
2

Quelqu'un peut-il s'il vous plaît expliquer le comportement de ce morceau de code (de http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx). Je n'ai pas compris pourquoi il affiche 18 pour le dernier appel.fonctions anonymes/récursion dans 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 

Merci

Répondre

2

Parce que fibCopy pointe encore sur la définition originale de fib: n => n > 1 ? fib(n - 1) + fib(n - 2) : n;. Dans cette définition, fib est utilisé. Mais fib a été modifié en n => n * 2.

exécution fibCopy(6) exécutera les éléments suivants:

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

Parce que 6 est supérieur à 1, la première branche de l'expression ternaire sera évaluée:

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

Merci Daniel. C'est une explication de gud. – umbersar