Y комбинаторы полезны, но я думаю, вы действительно хотите оптимизировать хвостовую рекурсию , которая исключает использование стека для хвостовых рекурсивных функций. Хвостовая рекурсия возможна только тогда, когда результат каждого рекурсивного вызова немедленно возвращается вызывающей стороной , и никакие дополнительные вычисления после вызова не выполняются. К сожалению, C # не поддерживает оптимизацию хвостовой рекурсии, однако вы можете эмулировать ее батутом , который позволяет легко преобразовать метод хвостовой рекурсии в батутный метод.
// Tail
int factorial( int n ) { return factorialTail( n, 1, 1 ); }
int factorialTail( int n, int i, int acc ) {
if ( n < i ) return acc;
else return factorialTail( n, i + 1, acc * i );
}
// Trampoline
int factorialTramp( int n ) {
var bounce = new Tuple<bool,int,int>(true,1,1);
while( bounce.Item1 ) bounce = factorialOline( n, bounce.Item2, bounce.Item3 );
return bounce.Item3;
}
Tuple<bool,int,int> factorialOline( int n, int i, int acc ) {
if ( n < i ) return new Tuple<bool,int,int>(false,i,acc);
else return new Tuple<bool,int,int>(true,i + 1,acc * i);
}