บทเรียน: Recursion & Backtracking
👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ
ฟังก์ชันที่เรียกตัวเองเพื่อแก้ปัญหาย่อย — รากฐานของ tree, graph และ backtracking
Recursion คือการที่ฟังก์ชันเรียกตัวเองเพื่อแก้ปัญหาที่เล็กลง ต้องมี 2 ส่วนเสมอ: base case (เงื่อนไขหยุด) และ recursive case (เรียกตัวเองกับปัญหาที่เล็กลง)
ตัวอย่างพื้นฐาน: factorial
python
def factorial(n):
if n <= 1: # base case
return 1
return n * factorial(n - 1) # recursive case
print(factorial(5)) # 120Backtracking: หาทุก subset
หลักการคือ "เลือก → เรียกตัวเอง → ถอยกลับ (undo)" ใช้กับโจทย์ที่ต้องลองทุกความเป็นไปได้ เช่น permutation, combination, การแก้ปริศนา
python
def subsets(nums):
res = []
def backtrack(start, path):
res.append(path[:]) # บันทึก subset ปัจจุบัน
for i in range(start, len(nums)):
path.append(nums[i]) # เลือก
backtrack(i + 1, path)
path.pop() # ถอยกลับ
backtrack(0, [])
return res
print(subsets([1, 2, 3]))ข้อควรระวัง
ลืม base case = recursion ไม่จบ (stack overflow) เสมอ และเขียน recursion ลึกเกินไปอาจช้า — บางโจทย์ควรแปลงเป็น loop หรือเพิ่ม memoization (ดูบท DP)