我们正在使用递归来查找因素,并且正在接收StackOverflow异常。我们已经读过the C# compiler on x64 computers performs tail call optimizations:



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

最佳答案

VSadov在其答复中提供了明确的原因:



此外,他继续声明:



因此答案是,尽管肯定可以使用和使用尾调用,但是无法预测它们何时将被使用或在C#中强制使用它们。

关于c# - 为什么这里没有进行尾部调用优化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41404854/

10-11 21:48