คำตอบที่ถูกต้องคือฟังก์ชั่นนี้ไม่ได้หยุดสำหรับจำนวนเต็มทั้งหมด (โดยเฉพาะจะไม่สิ้นสุดใน -1) เพื่อนของคุณถูกต้องในการระบุว่านี่คือ pseudocode และ pseudocode ไม่ได้จบลงใน stack overflow Pseudocode ไม่ได้ถูกกำหนดอย่างเป็นทางการ แต่ความคิดก็คือมันทำในสิ่งที่พูดบนดีบุก หากรหัสไม่ได้บอกว่า "ยุติด้วยข้อผิดพลาดล้นสแต็ค" ก็จะไม่มีข้อผิดพลาดสแต็คล้น
แม้ว่านี่จะเป็นภาษาการเขียนโปรแกรมจริงคำตอบที่ถูกต้องจะยังคงเป็น "ไม่ยุติ" เว้นแต่ว่าการใช้สแต็คจะเป็นส่วนหนึ่งของคำจำกัดความของภาษา ภาษาส่วนใหญ่ไม่ได้ระบุพฤติกรรมของโปรแกรมที่อาจล้นสแต็คเพราะมันยากที่จะรู้ได้อย่างแม่นยำว่ากองโปรแกรมจะใช้
หากการเรียกใช้รหัสบนล่ามหรือผู้แปลที่แท้จริงทำให้เกิดการล้นสแต็คในหลายภาษานั่นคือความแตกต่างระหว่างความหมายอย่างเป็นทางการของภาษาและการใช้งาน เป็นที่เข้าใจกันโดยทั่วไปว่าการใช้งานภาษาจะทำในสิ่งที่สามารถทำได้บนคอมพิวเตอร์รูปธรรมที่มีหน่วยความจำ จำกัด เท่านั้น หากโปรแกรมนั้นเสียชีวิตเมื่อมีการล้นสแต็กคุณควรซื้อคอมพิวเตอร์ที่มีขนาดใหญ่กว่านั้นทำการคอมไพล์ระบบใหม่หากจำเป็นเพื่อรองรับหน่วยความจำทั้งหมดและลองอีกครั้ง หากโปรแกรมไม่สิ้นสุดคุณอาจต้องทำสิ่งนี้ตลอดไป
แม้ความจริงที่ว่าโปรแกรมจะหรือไม่ล้นสแต็กก็ไม่ได้ถูกกำหนดไว้อย่างดีเนื่องจากการปรับให้เหมาะสมบางอย่างเช่นการปรับให้เหมาะสมของtail callและการบันทึกช่วยจำสามารถทำให้เกิดการเรียกใช้ฟังก์ชันในพื้นที่สแต็ก ข้อกำหนดทางภาษาบางอย่างแม้ในอาณัติว่าการใช้งานจะทำการปรับแต่ง tail call เมื่อเป็นไปได้ สำหรับฟังก์ชั่นนี้f(-1)
ขยายเป็นf(f(-2))
; การเรียกภายนอกf
คือการเรียกแบบหางดังนั้นจึงไม่ได้กดอะไรลงบนสแต็กดังนั้นจึงf(-2)
เข้าสู่สแต็กเท่านั้นและจะส่งกลับ-1
ดังนั้นสแต็กจะกลับไปอยู่ในสถานะเดิมที่อยู่ในช่วงเริ่มต้น ดังนั้นการเพิ่มประสิทธิภาพการโทรหางจึงf(-1)
วนซ้ำตลอดไปในหน่วยความจำคงที่