Recursive function คือ ฟังก์ชันเรียกใช้งานตัวเอง เรียกว่า ฟังก์ชันเรียกซ้ำ เพื่อทำงานบางอย่าง การทำงานของมันจะทำโดยการแบ่งปัญหาออกเป็นส่วนย่อยที่เล็กลง แล้วแก้ปัญหาเหล่านั้นให้ได้ผลลัพธ์ แล้วทำการรวมผลลัพธ์ที่ได้ทั้งหมดเข้าด้วยกันซึ่งการทำงานโดยการแบ่งส่วนงานย่อยนี้ จะช่วยทำให้การแก้ปัญหาทำได้ง่ายขึ้นเนื่องจากปัญหาถูกแบ่งย่อยให้เล็กลง รูปแบบการแก้ปัญหานี้เรียกว่า Divide and Conquer
การเขียนโปรแกรมด้วยการใช้งาน Recursive function จะเรียกใช้งานตัวเองจนพบกับเงื่อนไขที่ต้องการเพื่อที่จะหยุดเรียกการใช้งานตัวเอง ส่วนนี้จะสำคัญในการออกแบบฟังก์ชัน เพื่อไม่ให้เกิดการทำงานแบบไม่สิ้นสุดฉะนั้นการออกแบบควร กำหนดเงื่อนไขให้ชัดเจนเพื่อหยุดการทำงาน
ตัวอย่างการทำงานแบบเรียกซ้ำของ 5! ตัวอย่างการเขียนฟังก์ชันแบบ Recursive ด้วยภาษาจาวา
โค้ด: เลือกทั้งหมด
import java.util.Scanner;
public class Factorial{
public static void main(String []args){
Scanner input = new Scanner(System.in);//ตัวสแกนเนอร์ สร้างเพื่อใช้รับค่าทางคีย์บอร์ด
System.out.print("Enter number: ");
int number = input.nextInt();//รับค่าทางคีย์บอร์ด
int result = factorial(number);//สร้างตัวแปรสำหรับรับค่าที่คืนกลับมาของฟังก์ชัน factorial
System.out.print(result);//แสดงผลลัพธ์ที่ได้
}
public static int factorial(int n){
if(n == 0){//หากค่า n = 0 ส่งค่า 1กลับ เป็นเงื่อนไขการจบการเรียกตัวเองซ้ำ
return 1;
}else{//หากค่า n != 0 นำ n คูณกับ ค่าที่จะคืนกลับมาของฟังก์ชัน factorial พารามิเตอร์ที่ส่งไปจะเป็นค่า n-1
return n * factorial(n-1);
}
}
}
จากโค้ดผมได้ทำการสั่งค่า เลข 10 ไปหาค่าแฟกทอเรียล และได้ผลลัพธ์มาดังนี้ ข้อดี
- การกำหนดค่าตัวแปร ง่ายและสั้นกว่าฟังก์ชันแบบวนซ้ำ
- ปัญหาบางอย่างเป็นปัยหาที่ต้องใช้ฟังก์ชันแบบเรียกซ้ำในการแก้ปัญหา เช่น graph(กราฟ) , tree traverdsal(การท่องไปในต้นไม้)
- ฟังก์ชันแบบเรียกซ้ำใช้มีความต้องการการใช้พื้นที่มากกว่าแบบวนซ้ำ เพราะ การทำงานของฟังก์ชันจะยังไม่เสร็จ
ยังค้างไว้แต่ข้ามไปทำอันต่อไปก่อน จะเสร็จก็ต่อเมื่อพบเงื่อนไขที่ได้กำหนดไว้
เมื่อพบเงื่อนไข
การใช้งานฟังก์ชันแต่ละแบบก็ควรคำนึงถึงปัญหาที่เราจะนำฟังก์ชันนั้นๆไปแก้ปัญหาว่าเหมาะสมหรือไม่ เพราะการจะเขียนโปรแกรมให้มีประสิทธิภาพย่อมมีปัจจัยหลายอย่างไม่ว่าจะเป้นภาษาคอมพิวเตอร์ที่เราใช้เขียนโค้ด ฟังก์ชัน หรือแม้แต่ตัวฮาร์ดแวร์ที่เราใช้
อ้างอิง
https://www.makeuseof.com/what-is-a-recursive-function-and-how-do-you-create-one-in-java/
https://www.educative.io/courses/recursion-for-coding-interviews-in-cpp/qAx1lwQYDNG
https://www.slideshare.net/wongyos/tutor11