Это действительно кажется, что это правильно преобразуется в вызов хвоста при компиляции с .NET Framework 4. Обратите внимание, что в Reflector он переводит вашу функцию в while(true)
, как вы ожидаете хвостФункциональность в F # для выполнения:
[CompilationArgumentCounts(new int[] { 1, 1 })]
public static FSharpList<int> calc(FSharpList<int> acc, int startNum)
{
while (true)
{
int num = startNum;
switch (num)
{
case 1:
{
int d = num;
return ListModule.Reverse<int>(FSharpList<int>.Cons(d, acc));
}
}
int e = num;
if ((e % 2) == 0)
{
int e = num;
startNum = e / 2;
acc = FSharpList<int>.Cons(e, acc);
}
else
{
startNum = (startNum * 3) + 1;
acc = FSharpList<int>.Cons(startNum, acc);
}
}
}
Ваша проблема не связана с отсутствием, это является хвостовой вызов (если вы используете F # 2.0, я не знаю, каковы будут результаты).Как именно вы используете эту функцию?(Входные параметры.) Как только я получу более четкое представление о том, что делает функция, я могу обновить свой ответ, надеясь решить его.