วิธีการเขียน recursive แบบง่าย ๆ คือ
ส่วนตัวไม่เคยเขียน recursive function จะเขียนเป็น Iterative ตลอด ดังนั้นผมจะ ในกรณีตัวอย่างคือเมื่อ n = 0 และ n = 1 ทำให้ fibonacci ที่ 0,1 เป็นค่า 0,1 ตามลำดับ หากต้องการแก้ให้ fibonacci ที่ 0 เป็นค่า 1 ก็ทำการ return เป็น 1 แทน การทำแบบนี้ทำให้ฟังก์ชันนี้ไม่วนลูป infinity และสามารถได้คำตอบออกมา Fibonacci Iterative functionการเขียน Iterative ก็เหมือนกับการเขียนโปรแกรมทั่ว ๆ ไป คือเขียนตามเงื่อนไขที่ต้องการได้เลย อย่างในตัวอย่างนี้ก็ใช้การวนลูป การนำไปใช้
Depth First Searchcredit: https://www.zackbanack.com/blog/dfs Divide and Conquer
ถ้าให้ยกตัวอย่าง Divide and Conquer ก็คงจะเป็น Merge sort, Quick sort หลาย ๆคนคงรู้จักกันเป็นอย่างดี Merge Sortcredit: https://www.youtube.com/watch?v=ZRPoEKHXTJgcredit: https://en.wikipedia.org/wiki/Merge_sort จะเห็นได้ว่ามี 2 ส่วนการทำงานคือ แบ่งตัวเลขออกเป็น 2 ส่วนไปเรื่อย ๆ จนถึงตัวสุดท้าย (ใช้หลักการ DFS) กับ การจัดเรียงตัวเลข ฟังก์ชัน mergeSort คือส่วนของ Divide ทำหน้าที่แบ่งครึ่ง Diagram แสดงการทำงานโดยประมาณนะครับ โดย recursion แบ่งครึ่งจนเหลือแค่หลักเดียวแล้วถึงทำการเรียงลำดับจากน้อยไปมากไปเรื่อย ๆ Quick Sortcredit: https://en.wikipedia.org/wiki/Quicksort กำหนด 3 ค่าคือ low(ค่าแรก), pivot(ค่ากลาง), high(ค่าสุดท้าย) เมื่อเรียงในรอบครึ่งหนึ่งเสร็จ 1 รอบก็จะมีการกำหนดค่า pivot ใหม่เรียก recursive function เช็คทั้งครึ่งซ้ายและขวา Quick Sortตัวอย่างนี้มีการเกิด Divide and Conquer ทุกครั้งที่จบในครึ่งใดครึ่งหนึ่งต่อการเรียกใช้ recursion รอบหนึ่งและทำไปเรื่อย ๆ จนค่าเรียงน้อยไปมาก โจทย์ปัญหา
Balanced Parentheses Problemโจทย์คือให้หาคำตอบของทุกความเป็นไปได้ที่ทำให้วงเล็บเปิด-ปิดมีจำนวน n ทั้งเปิด-ปิด และต้องให้วงเล็บหันเข้าหากัน ตัวอย่างผลลัพธ์ตามจำนวน nก่อนจะเขียนโปรแกรม มาทำความเข้าใจก่อนว่าจะเขียนออกมาในแบบ recursive ออกมาได้ยังไงด้วยการสร้าง Diagram ของผลลัพธ์มาซักตัวอย่าง Balanced Parentheses Diagram input = 3เอามาเขียนโค้ดก็จะได้ประมาณนี้ Parentheses ProblemThe Maze Problemหาเส้นทางไปยังเป้าหมาย โดยให้ได้ผลลัพธ์ทุกความเป็นไปได้ของการไปยังเป้าหมาย หนึ่งในผลลัพธ์ที่ได้
Pass by Value and Pass by Referencecredit: http://www.mathwarehouse.com/programming/passing-by-value-vs-by-reference-visual-explanation.php มีการส่งตัวแปร maze ไปทุกครั้งที่เกิด recursion อย่างที่บอกว่า List คือ Object ชนิดหนึ่งมันจึงเป็นการ Pass by reference ดังนั้นหากเกิด recursion อีก ตัวแปร maze เปลี่ยนค่าภายใน นั่นหมายความว่าค่า maze ที่ส่งเก็บไว้ในตัวแปร result ก็เปลี่ยนไปด้วยเช่นกัน สรุปในปัจจุบันปัญหาบางอย่างยังไม่สามารถหาวิธีแก้ได้อย่างมีประสิทธิภาพได้ การหาคำตอบจึงทำได้โดยเข้าไปเช็คทุกความเป็นไปได้ หากเจอคำตอบก็…ก็ได้คำตอบนั่นแหละ ซึ่ง recursive function สามารถตอบโจทย์ในปัญหาตรงนี้ได้เป็นอย่างดี จบแล้วนะครับ หวังว่าจะช่วยให้เข้าใจเรื่อง recursive function มากขึ้น หากข้อมูลตรงไหนผิดพลาดก็บอกได้ครับ จะทำการแก้ไขทันที |