Мы используем рекурсию для поиска факторов и получаем исключение StackOverflow. Мы прочитали, что компилятор С# на компьютерах x64 выполняет оптимизацию хвостовых вызовов:
JIT определенно делает tailcals при запуске оптимизированного кода, а не отладки.
Запуск dotnet --configuration release
заходит так далеко в нашу программу:
...
7214 is a factor of 1234567890
7606 is a factor of 1234567890
10821 is a factor of 1234567890
11409 is a factor of 1234567890
Process is terminated due to StackOverflowException.
Почему оптимизация хвостового вызова не происходит?
class Program
{
static void Main(string[] args)
{
const long firstCandidate = 1;
WriteAllFactors(1234567890, firstCandidate);
}
private static void WriteAllFactors(long number, long candidate)
{
if (number % candidate == 0)
{
System.Console.WriteLine($"{candidate} is a factor of {number}");
}
candidate = candidate + 1;
if(candidate > number / 2)
{
return;
}
WriteAllFactors(number, candidate);
}
}