ฉันพบคำถามนี้เกี่ยวกับภาษาที่เพิ่มประสิทธิภาพการเรียกซ้ำหาง เหตุใด C # จึงไม่เพิ่มประสิทธิภาพการเรียกซ้ำหางเมื่อใดก็ตามที่ทำได้
สำหรับกรณีที่เป็นรูปธรรมเหตุใดจึงไม่ปรับวิธีนี้ให้เหมาะสมกับการวนซ้ำ ( Visual Studio 2008 32 บิตถ้าเป็นเช่นนั้น):
private static void Foo(int i)
{
if (i == 1000000)
return;
if (i % 100 == 0)
Console.WriteLine(i);
Foo(i+1);
}
preemptive
(เช่นอัลกอริธึมแฟกทอเรียล) และNon-preemptive
(เช่นฟังก์ชันของ ackermann) ผู้เขียนให้เพียงสองตัวอย่างที่ฉันได้กล่าวถึงโดยไม่ได้ให้เหตุผลที่เหมาะสมเบื้องหลังการแบ่งแยกนี้ การแยกส่วนนี้เหมือนกับฟังก์ชันการวนซ้ำของหางและไม่ใช่หางหรือไม่?