Надлежащим решением, а на самом деле идиоматическим решением во многих функциональных языках программирования, было бы использование комбинатора с фиксированной точкой . В двух словах: комбинатор с фиксированной запятой отвечает на вопрос «как определить рекурсивную анонимную функцию?». Но решение настолько нетривиально, что для их объяснения написаны целые статьи.
Простая, прагматичная альтернатива состоит в том, чтобы «вернуться назад во времени» к выходкам C: объявление перед определением. Попробуйте следующее (функция «факториал»):
Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);
Работает как шарм.
Или, для обхода дерева предзаказа на объекте класса TreeNode
, который соответствующим образом реализует IEnumerable<TreeNode>
для обхода его потомков:
Action<TreeNode, Action<TreeNode>> preorderTraverse = null;
preorderTraverse = (node, action) => {
action(node);
foreach (var child in node) preorderTraverse(child, action);
};