
recursive function คือ function เรียกใช้งานตัวเอง
ผมยังจำได้ดี กับคำถามที่เกิดขึ้นในสมอง เพราะว่าตอนที่เป็น programmer มือใหม่ๆ แล้วรู้จัก function นี้ไม่เคยคิดเลยว่ามันจะถูกใช้งานบ่อย จนปัจจุบันที่ทำงานเป็น programmer อยู่ก็ได้ใช้มันอยู่เรื่อยๆครับ แล้วทำให้คิดย้อนไปถึงคำถามที่ยังเป็นมือใหม่ เลยหยิบมาเล่าให้ฟังกันดีกว่า
เรื่อง recursive function การทำงานของมันก็คือ การสั่งเรียก ตัวเองให้ทำงาน หลักการมันมีแค่นี้เองแหล่ะครับ ที่เค้าเรียกว่า recursive function หรือว่า พูดให้เข้าใจง่ายๆ ก็คือ เขียนชุดคำสั่ง เพียงชุดเดียว แล้วให้มันหาคำตอบให้เราจนกว่าจะเจอ ถ้าไม่เจอ ก็ทำใหม่อีกรอบซะ ตัวอย่างเช่น เราอยากได้เลข ที่เกิดจากการสุ่ม จำนวน 3 หลัก ขึ้นมา แต่มีข้อแม้ว่า จะต้องไม่ซ้ำกับที่มีอยู่แล้วใน database
ถ้าเราเขียนแบบ งงๆ เราก็จะเขียน Algorithm ได้ดังนี้
- สุ่มตัวเลข
- เอาเลขที่สุ่ม ไปค้นใน database
- เช็คว่าซ้ำหรือไม่ ถ้าไม่ซ้ำ ให้น้ำค่านี้ไปใช้ ถ้าซ้ำ ให้ สุ่มเลขใหม่อีกครั้ง
- เอาเลขที่สุ่มได้จากข้อ 4 ที่อยู่ในเงื่อนซ้ำกับของเดิม ไปเช็คกับ database
- ทำซ้ำข้อ 3 (จะหยุดเมื่อเลขไม่ซ้ำใน database)
- ทำซ้ำข้อ 4
- ทำซ้ำข้อ 3 (จะหยุดเมื่อเลขไม่ซ้ำใน database)
- ทำซ้ำข้อ 4
- ......
ทีนี้การเขียนแบบนี้ ปัญหาจะอยู่ตรงที่ว่า เราจะต้องเช็คกี่รอบล่ะ? ถ้าจำนวน ความเป็นไปได้ในการสุ่มมันเยอะมาก แล้วข้อมูลมีเยอะมาก เราอาจจะต้อง loop program จนเมื่อยเลย ดังนั้น recursive function จึงเกิดมาเพื่อแก้ปัญหานี้ครับ เมื่อเราเขียนแบบ recursive เราจะเขียนโจทย์เดิมได้ดังนี้
Algorithm แบบ Recursive function
- สุ่มตัวเลข
- เอาตัวเลขที่สุ่ม ไปค้นใน database
- เช็คว่าซ้ำหรือไม่ ถ้าไม่ซ้ำ ให้นำค่านี้ไปใช้ และหยุดการทำงานชุดคำสั่งข้อ 1-2 ถ้าซ้ำ ให้เริ่มทำข้อ 1 ใหม่
แค่นี้เองครับ สั้นๆ จบแล้ว ทีนี้ หัวใจของ recursive function คือต้องระวังการเป็น infinity loop ก็คือทำซ้ำไม่รู้จบ เพราะไม่อย่างนั้นโปรแกรมจะทำงานแบบไม่จบเลยครับ ถ้าเราเขียนเป็น function เราก็ใช้ จบ function ด้วย return นั่นเอง
ภาพ ปลากินปลาแบบ recursive credit: http://jackson.stark.k12.oh.us/JacksonHigh.cfm?subpage=1252889
ตัวอย่างโค้ด recursive function
function find_unique(){
$num = rand(1,999); //random ตัวเลข
$result = check_in_database($num); //เอาไปเช็คใน database ถ้าไม่ซ้ำให้คืนค่า TRUE ถ้าซ้ำให้คืนค่า FALSE
if( $result === TRUE ){
return $num; // คืนค่า และออกจากการทำงานของ function
} else {
find_unique(); // recursive
}
}
ที่นี้ เข้าใจหรือยังครับ ว่า recursive function มันช่วยงานเราได้อย่างไร