06 — Recursion and Backtracking¶
Recursion-ই প্রথম technique যেটা তোমাকে শুধু আলাদাভাবে code করতে না, আলাদাভাবে ভাবতে বলে। এখানে এটা master করো — trees, graphs, আর dynamic programming সব সহজ হয়ে যাবে।
এই technique-টা কী?¶
Recursion হলো এমন একটা function যেটা একই problem-এর ছোট version-এর উপর নিজেকেই call করে problem solve করে — যতক্ষণ না version-টা এত ছোট হয় যে সরাসরি উত্তর দেওয়া যায় (সেটাই base case)।
Backtracking হলো steering wheel লাগানো recursion: প্রতিটা step-এ তুমি একটা option choose করো, তার পরিণতি recursively explore করো, তারপর un-choose (undo) করো যাতে পরের option-টা try করতে পারো। এটা প্রতিটা candidate solution-এ নিয়ম মেনে হাঁটে, আর candidate-দের মধ্যে কাজ ভাগ করে নেয়।
কেন এটা আছে (কোন ব্যথাটা সারায়)¶
কিছু problem স্বভাবতই self-similar — "একটা folder-এ files আর folders থাকে, যেগুলোতে আবার files আর folders থাকে..." — আর loop দিয়ে এগুলো লিখতে গেলে pending কাজের stack তোমাকে নিজেই সামলাতে হয়। Recursion-এ language-ই সেই stack সামলায়, তাই code-টা problem-এর আকৃতির আয়না হয়ে যায়।
Backtracking আছে কারণ কিছু প্রশ্নের কোনো formula নেই: "সব valid seating-এর list দাও", "queen-দের এমনভাবে বসাও যেন কেউ কাউকে attack না করে"। একমাত্র সৎ পদ্ধতি হলো গোছানো trial and error, আর backtracking হলো নিখুঁত হিসাব-রাখা trial and error — এটা কখনো একই dead end দুবার ঘোরে না, আর কোনো guess undo করতে ভোলে না।
বাস্তব software-এ কোথায় ব্যবহার হয়¶
- File-system walker, directory size calculator, recursive delete।
- Parser আর compiler (grammar recursive; JSON-ও তাই)।
- Constraint solver: Sudoku app, scheduling, register allocation।
- UI tree: nested component render করা একটা recursive walk।
- Game AI: move tree explore করা (minimax) হলো scoring সহ backtracking।
Prerequisites¶
- Python-এ function, parameter, return value।
- List আর slicing।
../04-stack-and-queue/— call stack নিজেই একটা stack; recursion গোপনে যে data structure ব্যবহার করে, ওই section সেটাই বোঝায়।
শেখার আগে কী revise করবে¶
- Stack কী (LIFO) — recursion-এর frame-গুলো একটার উপরেই থাকে।
- Function argument কীভাবে local হয়: প্রতিটা call parameter-এর নিজস্ব copy পায়।
- List-এর
append/pop— choose/un-choose mechanic ঠিক এ দুটোই ব্যবহার করে।
Learning goals¶
- [ ] প্রতিবার, অন্য কিছু লেখার আগে একটা সঠিক base case লেখা।
- [ ]
factorial(4)-এর call stack বাড়তে আর কমতে দেখে আঁকা। - [ ]
fib(4)-এর recursion tree এঁকে repeated subproblem-গুলোতে আঙুল রাখা। - [ ] "Leap of faith" এক বাক্যে বলা আর দুশ্চিন্তা ছাড়া ব্যবহার করা।
- [ ] Include/exclude branch দিয়ে subsets implement করা।
- [ ] Choose-each-remaining দিয়ে permutations implement করা।
- [ ] Combination search-এ pruning যোগ করা আর কেন সেটা safe তা ব্যাখ্যা করা।
- [ ] একটা ছোট N-Queens solve করে choose → explore → un-choose গল্পের মতো বলা।
- [ ] Memoization কীভাবে exponential
fib-কে linear বানায় তা ব্যাখ্যা করা (DP-র bridge)।
Problem categories¶
| Category | One-line idea |
|---|---|
| Decrease-and-conquer | Input এক ধাপ ছোট করো; ছোট উত্তরটাকে বিশ্বাস করো |
| Divide-and-conquer | অর্ধেক করে ভাঙো; অর্ধেকগুলোর উত্তর জোড়া লাগাও |
| Subsets / include-exclude | প্রতিটা item-এর জন্য: নাও বা বাদ দাও (2^n leaves) |
| Permutations | প্রতিটা slot-এ যেকোনো unused item বেছে নাও (n! leaves) |
| Combinations with pruning | Subsets-এর মতো, কিন্তু যে branch জিততে পারবে না সেটা কেটে ফেলো |
| Constraint backtracking | বসাও, validity check করো, recurse করো, undo করো (N-Queens style) |
| Memoized recursion | Subproblem-এর উত্তর cache করো — DP-র দরজা |
Practice list¶
Easy¶
| Problem | Source | Pattern |
|---|---|---|
| Fibonacci Number | https://leetcode.com/problems/fibonacci-number/ | Decrease-and-conquer → memoization |
| Climbing Stairs | https://leetcode.com/problems/climbing-stairs/ | Decrease-and-conquer → memoization |
| Reverse String | https://leetcode.com/problems/reverse-string/ | Decrease-and-conquer (two-end recursion) |
| Power of Two | https://leetcode.com/problems/power-of-two/ | Decrease-and-conquer (divide by 2) |
| Pow(x, n) | https://leetcode.com/problems/powx-n/ | Divide-and-conquer (fast power) |
Medium¶
| Problem | Source | Pattern |
|---|---|---|
| Subsets | https://leetcode.com/problems/subsets/ | Include/exclude branch |
| Subsets II | https://leetcode.com/problems/subsets-ii/ | Include/exclude + duplicate skipping |
| Permutations | https://leetcode.com/problems/permutations/ | Choose each remaining |
| Permutations II | https://leetcode.com/problems/permutations-ii/ | Choose remaining + duplicate skipping |
| Combination Sum | https://leetcode.com/problems/combination-sum/ | Combinations with pruning |
| Combination Sum II | https://leetcode.com/problems/combination-sum-ii/ | Pruning + duplicate handling |
| Generate Parentheses | https://leetcode.com/problems/generate-parentheses/ | Constraint backtracking (counts as validity) |
| Letter Combinations of a Phone Number | https://leetcode.com/problems/letter-combinations-of-a-phone-number/ | Cartesian choose-explore |
| Word Search | https://leetcode.com/problems/word-search/ | Grid backtracking with visited marks |
| Palindrome Partitioning | https://leetcode.com/problems/palindrome-partitioning/ | Cut-point backtracking |
Hard¶
| Problem | Source | Pattern |
|---|---|---|
| N-Queens | https://leetcode.com/problems/n-queens/ | Constraint backtracking |
| Sudoku Solver | https://leetcode.com/problems/sudoku-solver/ | Constraint backtracking |
| Word Search II | https://leetcode.com/problems/word-search-ii/ | Backtracking + trie (পরের section-গুলোর preview) |
| CSES "Chessboard and Queens" | https://cses.fi/problemset/ (task name: Chessboard and Queens) | N-Queens with blocked cells |
| CSES "Creating Strings" | https://cses.fi/problemset/ (task name: Creating Strings) | Permutations with duplicates |
Visualization ideas¶
factorial(4)-এর জন্য থালার-stack animation: প্রতিটা call-এ একটা থালা, নামার সময় push, ওঠার সময় উত্তর লেখা অবস্থায় pop।fib(5)-এর recursion tree এঁকে প্রতিটা repeated node-এ গোল দাগ দাও — তারপর memoization দিয়ে আবার এঁকে দেখো tree-টা কীভাবে ধসে পড়ে।[1,2,3]-এর subsets-এর জন্য: একটা binary decision tree, left = include, right = exclude; 8টা leaf-ই হলো 8টা subset।- 4x4 board-এ N-Queens: প্রতি row-তে একটা queen বসানো animate করো, attack হলে লাল X, আর আটকে গেলে queen ডানে সরে যাওয়া (সেটাই un-choose)।
- Recursion visualizer আছে https://visualgo.net/en-এ (recursion tree mode)।
Common mistakes (সাধারণ ভুল)¶
- Base case নেই বা ভুল →
RecursionError: maximum recursion depth exceeded। - একই size-এর input-এ recurse করা (কোনো progress নেই) → infinite recursion।
- Choice undo করতে ভুলে যাওয়া (un-choose step) → এক branch-এর state অন্য branch-এ leak করে।
- Result-এ copy (
path[:])-র বদলে livepathlist-টাই append করা → সব result একটাই বদলাতে-থাকা list-কে alias করে। - Leap of faith-এ ভরসা না রেখে প্রতিটা call মনে মনে trace করার চেষ্টা → 3 level-এর গভীরে গেলেই paralysis।
- Overlapping subproblem বারবার compute করা (naive
fib), যেখানে এক লাইনের@lru_cacheসব ঠিক করে দিত। - Python-specific: default recursion limit প্রায় 1000; গভীর recursion-এ
sys.setrecursionlimitলাগে, নয়তো iterative rewrite।
Interview problem-এর সাথে connection¶
"Generate all X" প্রশ্নগুলো (subsets, permutations, combinations, parentheses, partitions) big-tech interview loop-এর ধ্রুবতারা — এগুলো পরীক্ষা করে তুমি state পরিষ্কারভাবে সামলাতে পারো কি না। N-Queens-style placement-এর মতো constraint puzzle পরীক্ষা করে pruning-এর instinct। Interviewer-রা follow-up হিসেবে "now make it faster"-ও খুব ভালোবাসে — সেটাই ঠিক memoization-এর সেই DP bridge, যেটা দিয়ে এই folder শেষ হয়।
Competitive programming-এর সাথে connection¶
- Complete search (recursion দিয়ে brute force) CP-র official প্রথম অস্ত্র: একই দর্শনের জন্য দেখো https://usaco.guide/-এর Bronze "Complete Search"।
- CSES Introductory Problems-এ সরাসরি backtracking task আছে (Chessboard and Queens, Creating Strings): https://cses.fi/problemset/।
- Pruning-এর মান-ই ঠিক করে exponential search time limit-এর মধ্যে pass করবে কি না।
- Recursion depth limit-এর জন্য Python-এ CP কঠিন হয় — iterative conversion-গুলো জেনে রেখো।
Recommended learning order¶
concept.md— call stack, base cases, leap of faith, choose/explore/un-choose।visual-explanation.md—factorial(4)-এর stack movie আরfib(4)-এর tree।patterns.md— decrease-and-conquer থেকে DP bridge পর্যন্ত সাতটা named pattern।implementation.py— চালাও; factorial, fib (naive vs memo), subsets, permutations, N-Queens পড়ো।problems/README.md— practice ladder, easy থেকে hard।
Source map¶
এই folder-এর সব source, link আর copying status: দেখো source-map.md।