Notes & software courses · Free to learn
Aph's Blog
On this page

บทเรียน: 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))  # 120

Backtracking: หาทุก 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)