Python – recursive function

og:image

การใช้งานฟังก์ชันแบบ recursive


ในการใช้งานฟังก์ชันนั้น นอกจากเราจะระบุชุดคำสั่งเพื่อดำเนินการแล้ว เรายังสามารถจะเรียกใช้งานฟังก์ชันอื่นจากในฟังก์ชันได้ และสามารถเรียกใช้ตัวฟังก์ชันตัวเองซ้อนกันได้อีกด้วย ซึ่งการเขียนฟังก์ชันที่มีการเรียกใช้ฟังก์ชันตัวเองนั้นเราจะเรียกการใช้งานแบบนี้ว่า ฟังก์ชัน recursive

ตัวอย่างการใช้งาน

# สร้างฟังก์ชันสำหรับการคำนวณแฟคทอเรียล(n!)
def factorial(n):
    # ตรวจสอบข้อมูลตัวเลข หากเป็นจำนวนลบ ให้แจ้งข้อผิดพลาด	
    if n < 0:
        raise ValueError("กรุณาระบุข้อมูลเป็นตัวเลขจำนวนเต็มบวก สำหรับการคำนวณแฟคทอเรียล") 

    # ตรวจสอบข้อมูลตัวเลข หากเป็น 0 ผลลัพท์ของแฟคทอเรียลคือ 1
    elif n==0 :
        return 1

    # ตรวจสอบข้อมูลตัวเลข หากเป็นจำนวนเต็มมีค่าตั้งแต่ 1 ขึ้นไป ให้เรียกฟังก์ชันตัวเองซ้อนลงไปเรื่อยๆ เพื่อคำนวณหาแฟคทอเรียล  n x (n-1)!
    elif n > 0:
        return n*factorial(n-1)

n = 6
factorial_n = factorial(n)
print("factorial of %d: %d" %( n, factorial_n ))
# โปรแกรมทำการปรินต์ค่า 
# factorial of 6: 720
# ผลที่ได้มาจาก 6 x 5 x 4 x 3 x 2 x 1

จากตัวอย่าง จะใช้งานฟังก์ชันแบบ recursive เพื่อจะทำการคำนวณแฟคทอเรียล(factorial) โดย

แฟคทอเรียลของ n (n!) คือผลคูณของจำนวนเต็มบวกตั้งแต่ 1 ถึง n เมื่อ n คือจำนวนเต็มบวก
ดังนั้นเมื่อ n=6 ดังนั้น 6! = 6 x 5 x 4 x 3 x 2 x 1 โดยสามารถกล่าวได้ว่า
6! = 6 x 5!
5! = 5 x 4! = 5 x (5-1)!
4! = 4 x 3! = 4 x (4-1)!
3! = 3 x 2! = 3 x (3-1)!
2! = 2 x 1! = 2 x (2-1)!
1! = 1
เราจึงใช้รูปแบบดังกล่าวมา สร้างเป็นรูปแบบฟังก์ชันแบบ recursive เพื่อใช้ในการคำนวณ factorial ได้

คำนวณ factorial

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


ข้อดีของการใช้ recursive

  1. ทำให้การเขียนโค้ดนั้นดูสะอาดตา เพราะใช้โค้ดเดิมซ้ำๆ กัน(reuse) จำนวนบรรทัดของคำสั่งจึงน้อยลง
  2. สามารถแบ่งงานที่ซับซ้อน ให้แตกเป็นส่วนงานย่อยๆ
  3. การสร้างข้อมูลที่มีลำดับในบางกรณี การใช้งาน recursive จะง่ายกว่า การใช้ nested loop

ข้อเสียของการใช้ recursive

  1. การเขียนการทำงานที่ซับซ้อนบางอย่างด้วย recursive อาจทำให้คนอ่านโปรแกรมทีหลัง ทำความเข้าใจการทำงานค่อนข้างยาก เพราะชุดคำสั่งจะค่อนข้างน้อยแต่ข้อมูลส่วนใหญ่จะถูกประมวลผลในหน่วยความจำเกือบทั้งหมด
  2. การใช้ recursive จะต้องใช้หน่วยความจำในระบบค่อนข้างสูง เนื่องจากต้องเก็บข้อมูลในทุกรอบไว้ในหน่วยความจำทั้งหมด
  3. การใช้ recursive ทำให้ยากในการที่จะ debug โปรแกรม เพราะข้อมูลที่ใช้ในการประมวลผลในแต่ละรอบนั้นขึ้นอยู่กับข้อมูลในรอบก่อนหน้า ไม่ได้แยกเป็นคำสั่งหนึ่งบรรทัด

ที่มาของข้อมูล: https://www.programiz.com/python-programming/recursion
สร้าง diagram: draw.io
ศึกษาเพิ่มเติมเกี่ยวกับแฟคทอเรียล: แฟคทอเรียล