ตรวจสอบรหัสสกาล่านี้:
def rec(n: Int) {
if (n > 1) {
val d = n / 2
rec(d)
// if (d > 1) // abort loop
rec(n/d)
}
}
รหัสนี้จะส่งผลให้เกิดการวนซ้ำไม่รู้จบ เนื่องจากการเพิ่มประสิทธิภาพแบบเรียกซ้ำแบบหางฉันจึงไม่ได้รับ StackOverflowError
ถอดรหัสด้วย jad ฉันได้รับโค้ด Java นี้:
public void rec(int n)
{
int d;
for(; n > 1; n /= d)
{
int i = n;
d = i / 2;
rec(d);
}
}
ในบรรทัดสุดท้ายของลูปเมธอดจะเรียกตัวเอง ดังนั้นฉันจึงไม่เข้าใจตำแหน่งการเรียกส่วนท้าย ใครสามารถอธิบายเรื่องนี้ได้บ้าง?