1.2.39 · Coding › Introduction to Programming (Python)
Har baar jab ek function khud ko call karta hai, Python ko yaad rakhna padta hai ki woh kahan tha taaki baad mein woh wahan wapas aa sake. Woh yeh "mujhe yaad rakhna" wali note ek plates ki stack par store karta hai jise call stack kehte hain. Recursion plates ko badhata rehta hai. Agar kabhi rukta nahi, toh plates ki stack badhti jaati hai jab tak woh girr nahi jaati — woh crash stack overflow kehlata hai. Python ek asli crash ko rokne ke liye ek soft limit set karke pehle RecursionError raise karta hai.
Call stack memory ka ek region hai (LIFO — Last In, First Out) jahan interpreter har active function call ke liye ek stack frame push karta hai. Har frame us call ki local variables, arguments, aur return address (caller mein kahaan resume karna hai) rakhta hai.
Definition Recursion depth
Recursion depth un frames ki count hai jo ek saath stack par hoti hain — yaani kitne calls "pause hokar, wait kar rahe hain" ek inner call ke khatam hone ka.
Definition Stack overflow
Stack overflow tab hota hai jab call stack ka memory khatam ho jaata hai. OS ko program band karne se rokne ke liye, CPython ek maximum recursion depth (default 1000 ) enforce karta hai aur RecursionError: maximum recursion depth exceeded raise karta hai.
Stack memory fixed aur chhoti hoti hai (aksar ~1–8 MB), heap memory ke unlike jo bahut badi hoti hai. Har frame stack ka ek chunk khaata hai. Agar recursion unbounded hai (missing/galat base case), frames hamesha badhte rehte hain. Ek software limit ke bina, aapko ek hard, buri OS-level segfault milti. Python iske bajaay ek catchable RecursionError throw karta hai taaki aap gracefully debug kar sakein.
Ek infinite recursion consider karein (classic bug):
def boom (n):
return boom(n + 1 ) # no base case → never stops
boom( 0 )
Worked example Stack growth ko trace karna
Call
Frame pushed
Depth
boom(0)
frame for n=0
1
boom(1)
frame for n=1
2
boom(2)
frame for n=2
3
...
...
...
boom(999)
frame for n=999
1000 → RecursionError
Yeh step kyun? Har call pehle hoti hai jab previous wali return nahi hoti, toh koi frame kabhi pop nahi hoti. Depth har call par 1 badhti hai jab tak limit tak nahi pahunch jaati.
setrecursionlimit ko ek million kar do!"
Kyun sahi lagta hai: error kehti hai "limit exceeded", toh limit badhana chahiye fix karna. Kyun galat hai: limit aapko real stack memory exhaustion se protect karti hai. Ise bahut zyada set karo aur Python soft limit se aage nikal jaata hai seedha ek hard OS segfault mein — ek uncatchable crash bina kisi traceback ke. Fix: limit ko sirf genuinely deep-but-finite recursion ke liye thoda badhao; warna base case ko fix karo ya iteration mein convert karo.
Common mistake "Mera base case exist karta hai, toh main safe hoon."
Kyun sahi lagta hai: aapne if n == 0: return likha. Kyun galat hai: agar recursive step kabhi base case ki taraf badhta nahi (jaise f(n) calls f(n) ya f(n+1) jab base n==0 hai), toh woh kabhi reach nahi hoti. Fix: ensure karo ki har call strictly base case ki taraf approach kare (jaise f(n-1) with base n<=0).
Worked example Example 1 — Deep lekin legal recursion
def depth_sum (n):
if n == 0 : # base case
return 0
return n + depth_sum(n - 1 )
depth_sum( 2000 ) # RecursionError! default limit 1000
Yeh step kyun? depth_sum(2000) ko ek saath 2001 stacked frames chahiye — 1000 se kaafi zyada. Logic sahi hai, lekin depth limit se zyada hai. Fix: ya toh sys.setrecursionlimit(3000) ya iteratively rewrite karo.
Worked example Example 2 — Iterative rewrite (koi stack growth nahi)
def depth_sum_iter (n):
total = 0
while n > 0 :
total += n
n -= 1
return total
depth_sum_iter( 2_000_000 ) # works fine, depth stays 1
Yeh step kyun? Ek loop ek frame reuse karta hai; variable total ek call ke heap-friendly stack par rehta hai. Koi frames pile up nahi hote → n chahye kitna bhi ho, koi overflow nahi.
Worked example Example 3 — Error ko catch karna
import sys
def safe_factorial (n):
try :
if n <= 1 : return 1
return n * safe_factorial(n - 1 )
except RecursionError :
return None # signal "too deep"
Yeh step kyun? RecursionError ek normal exception hai, toh try/except kaam karta hai. Yahi kyun hai ki Python soft limit use karta hai segfault ke bajaay — aap recover kar sakte ho.
Intuition 20% jo 80% deta hai
Har recursive call = ek stack frame ; depth = frames ek saath stacked.
Default limit ≈ 1000 total frames; isse cross karne par → catchable RecursionError.
Real fix hai ek correct, reachable base case ya ek iterative version , limit ko blindly badhana nahi .
Active function calls kaun sa data structure store karta hai? Call stack (LIFO), jo har active call ke liye ek stack frame rakhti hai.
Stack frame kya cheezein rakhta hai? Call ki local variables, arguments, aur return address (caller mein kahaan resume karna hai).
Recursion depth define karo. Recursion ke dauran ek saath active (paused) stack frames ki sankhya.
CPython mein default recursion limit kya hai? Lagbhag 1000 total frames.
Python bahut deep recursion par kaun sa error raise karta hai? RecursionError: maximum recursion depth exceeded.
Python crash karne ki jagah soft limit kyun use karta hai? Taaki OS ke hard, uncatchable stack overflow (segfault) se pehle ek catchable RecursionError raise ho sake.
Limit ko kaise read aur change karte hain? sys.getrecursionlimit() aur sys.setrecursionlimit(N).
setrecursionlimit badhana dangerous kyun hai? Bahut zyada value recursion ko real stack memory exhaust karne de sakti hai, jisse uncatchable segfault ho sakta hai.
Limit hit karne ke do robust fixes? Ensure karo ki ek correct base case ho jo actually approach ki jaati hai, ya algorithm ko iteratively rewrite karo.
Limit exactly 1000 of YOUR calls kyun allow nahi karti? Yeh saare frames count karti hai, including pre-existing ones, toh available depth ≈ 1000 − (already-stacked frames).
Recall Feynman: ek 12-saal ke bache ko explain karo
Socho tum dinner plates stack kar rahe ho. Har baar jab ek function khud ko call karta hai, tum ek aur plate pile par rakh dete ho — woh plate yaad rakhti hai function kya kar raha tha. Jab sabse deep wala function khatam hota hai, tum ek plate neeche le aate ho. Lekin agar ek function khud ko call karta rehta hai aur kabhi khatam nahi hota , tum plates stack karte rehte ho hamesha ke liye. Aakhirkar pile bahut zyada unchi ho jaati hai aur floor par crash ho jaati. Python smart hai: lagbhag 1000 plates par woh chillata hai "RUKO! RecursionError!" ki puri cheez gir jaaye. Ise sach mein fix karne ke liye, function ko ek clear finish line (base case) do jo woh actually reach kare — ya ek simple loop use karo jo sirf ek plate baar baar use karta hai.
Mnemonic Cause-chain yaad rakho
"No Base → Frames Race → Stack's out of Space."
Koi base case nahi ⇒ frames badhte rehte hain ⇒ stack memory khatam ho jaati hai ⇒ RecursionError.
fixed small memory 1-8 MB
counts all frames not per function
Locals args return address
Base case missing or wrong
Max recursion depth default 1000
sys.getrecursionlimit setrecursionlimit