анонимные функции / рекурсия в c # - PullRequest
2 голосов
/ 27 июля 2011

Может кто-нибудь объяснить, пожалуйста, поведение этого куска кода (из http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx). Я не понял, почему он отображает 18 для последнего вызова.

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

Спасибо

1 Ответ

2 голосов
/ 27 июля 2011

Поскольку 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
...