Chúng tôi đang sử dụng đệ quy để tìm các yếu tố và đang nhận ngoại lệ StackOverflow. Chúng tôi đã đọc rằng the C# compiler on x64 computers performs tail call optimizations:Tại sao tối ưu hóa cuộc gọi đuôi không xảy ra ở đây?
JIT chắc chắn thực hiện tailcals khi chạy mã được tối ưu hóa và không gỡ lỗi.
Chạy dotnet --configuration release
bị này đến nay trong chương trình của chúng tôi:
...
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.
Tại sao tối ưu hóa cuộc gọi đuôi không xảy ra?
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);
}
}
Không gọi đệ quy đuôi yêu cầu bạn trả lại giá trị? – zzzzBov
@zzzzBov Tôi đoán đó là một câu hỏi tu từ. :) –
Không có sự trở lại nào cả; điều gì khiến điều này ngừng chạy mãi mãi? –