Tail Recursion คืออะไร

ในการเขียนโปรแกรมคอมพิวเตอร์ tail recursion คือการใช้ tail call เพื่อทำหน้าที่เรียกซ้ำ การเรียกหางคือเมื่อฟังก์ชั่นถูกเรียกว่าเป็นการกระทำสุดท้ายของฟังก์ชั่นอื่น ตัวอย่างเช่นในโปรแกรม JavaScript นี้:

 var myTailFunc = function (myVar) {return myVar; }; var myFunc = function (myVar) {return myTailFunc (myVar); }; 

ที่นี่การเรียกใช้ myTailFunc (myVar) เป็นการโทรแบบหางเนื่องจากเป็นการดำเนินการครั้งสุดท้ายของ myFunc (myVar) เมื่อคอมไพเลอร์เห็นว่าเป็นการดำเนินการขั้นสุดท้ายของ myFunc ก็สามารถทำการปรับให้เหมาะสมขนาดเล็กได้ โดยพื้นฐานแล้วมันไม่จำเป็นต้องผลักที่อยู่ผู้ส่งคืนลงในสแต็กเพราะมันจะไม่จำเป็นต้องกลับไปที่ myFunc มันสามารถคืนค่าตอบแทนของ myTailFunc เป็นค่าตอบแทนของ myFunc

การเพิ่มประสิทธิภาพขนาดเล็กนี้มีความสำคัญมากขึ้นเมื่อใช้ในฟังก์ชันแบบเรียกซ้ำ โดยทั่วไปการเรียกซ้ำแต่ละระดับจะต้องมีที่อยู่ผู้ส่งเพิ่มเติมเพื่อผลักไปยังกองซ้อน การเรียกซ้ำแบบหางทำให้สิ่งนี้ไม่จำเป็น

นี่คือตัวอย่างของฟังก์ชั่น JavaScript แบบง่าย ๆ ที่เขียนขึ้นเป็นอันดับแรกโดยไม่ต้องใช้และจากนั้นเรียกใช้การเรียกซ้ำแบบหาง

ฟังก์ชั่นแฟกทอเรียลโดยไม่มีการเรียกซ้ำแบบหาง

 var factorial = function (n) {ถ้า (n == 0) {return 1; } else {return n * factorial (n - 1); }}; 

ฟังก์ชั่นนี้เรียกซ้ำ แต่ไม่ใช่หางซ้ำ กระบวนการสุดท้ายของฟังก์ชันคือการดำเนินการคูณ (" * ") ดังนั้นการเรียกซ้ำจะต้องกลับไปที่ฟังก์ชันการเรียกเสมอ

ฟังก์ชันแฟกทอเรียลพร้อมการวนรอบแบบซ้ำ

 var factorial = function (n) {var recursion = function (n, ผลรวมย่อย) {ถ้า (n == 0) {return subTotal; } else {return recursion (n - 1, n * subTotal); }}; ส่งกลับการสอบถามซ้ำ (n, 1); }; 

ฟังก์ชั่นเงื่อนไขการเขียนโปรแกรม