Рассмотрим функцию факториала, определенную в теле метода как лямбда-выражение и присвоенную переменной:
Func<int, int> factfail = n =>
{
if (n == 0)
return 1;
else
return n * factfail(n-1);
};
Это не удалось, поскольку factfail
еще не ограничен локальной переменной.
Есть ли способ добавить некую точку фиксации - путем абстрагирования самой функции?!
Func<Func<int, int>, int, int> fact_ = (fact, n) =>
{
if (n == 0)
return 1;
else
return n * fact(n-1);
};
fact_(??);
длинная история:
Мне нужно написать рекурсивную функцию, у которой есть побочный эффект изменения некоторого внешнего состояния.
Поэтому я пытаюсь написать этот метод как лямбда-выражение, которое фиксирует это внешнее состояние.
Я все еще экспериментирую с разными стилями, как написать это и - помимо этого одного словаря, который должен быть одинаковым для всех рекурсивных вызовов - я хочу быть настолько функциональным и ленивым, насколько это возможно.
Так что я играл с LINQ, так как это помогает мне сократить взаимные данные.
Это также помогает понять, какие части кода могут быть выражены в функциональном стиле.
Чтобы быть кратким в операторе LINQ, полезно иметь возможность определять некоторые вспомогательные функции перед ними, и я сделал это, связав лямбда-выражения с переменными.
И с помощью выражения lamda я также могу захватить свой словарь без необходимости явно передавать его ссылку на метод, что весьма неплохо.
не уверен, что я на правильном пути, хотя ...