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);
}