1.2.37 · D2 · HinglishIntroduction to Programming (Python)

Visual walkthroughRecursion — call stack visualization, base case, recursive case

1,942 words9 min read↑ Read in English

1.2.37 · D2 · Coding › Introduction to Programming (Python) › Recursion — call stack visualization, base case, recursive c

Kuch bhi shuru karne se pehle, teen plain words jo hum poore page mein use karenge:

Humara target, ek baar clearly bola gaya taaki neeche ka har symbol earned lage:


Step 1 — Self-similar shape dhundho

KYA. Product ko dekho aur last number, , ko peel karo: Toh . Term ka matlab hai "wohi factorial question, lekin ek size chota".

KYUN. Recursion tabhi kaam aati hai jab ek bada problem apne andar ek chota copy contain karta ho. Yahan copy literally andar baithi hai: jaanne ke liye tumhe sirf aur ka answer chahiye. Woh embedded copy hi recursive case hai.

PICTURE. Neeche nested boxes: outer box hai; label peel karne par ek identical-shaped inner box dikhta hai, aur aise aage andar jaate jaate.

Figure — Recursion — call stack visualization, base case, recursive case

Step 2 — Woh floor dhundho jahan shrinking rukti hai

KYA. Peeling karte raho: . Aur ko hum simply define karte hain ke barabar (empty product — kuch bhi multiply nahi, "do-nothing" number milta hai).

KYUN. Ek recursive machine jo sirf shrink karti rahe woh hamesha ke liye girती rahegi. Humein ek aisa input chahiye jiska answer seedha pata ho, zero further recursion ke saath. Yahi base case hai. choose karna ( nahi) input ko bhi free mein correctly handle kar leta hai.

PICTURE. Descending staircase: har step input ko ek se giraata hai; base case woh solid ground hai jis par staircase land karti hai.

Figure — Recursion — call stack visualization, base case, recursive case

Step 3 — Do-case rule likho

KYA. Steps 1 aur 2 ko ek definition mein glue karo. Brace ka matlab hai "woh line choose karo jiska condition true ho":

KYUN. Har recursive function ko exactly yeh do parts chahiye: ek stop (base case) aur ek shrink-and-combine (recursive case). base ki taraf progress guarantee karta hai; woh "combine" hai jo answer ko reassemble karta hai.

PICTURE. Ek fork-in-the-road: diamond n == 0 test karta hai; ek branch return karta hai, doosra multiply karta hai aur ek chota self call karta hai.

Figure — Recursion — call stack visualization, base case, recursive case
def fact(n):
    if n == 0:            # base case  → the STOP
        return 1
    return n * fact(n-1)  # recursive case → shrink & combine

Step 4 — Winding: frames ko pile up hote dekho

KYA. fact(3) call karo. Yeh finish nahi ho sakta, kyunki ise pehle fact(2) chahiye — toh yeh pause karta hai aur ek naya frame push hota hai. Uss wale ko fact(1) chahiye, pause, push. Aur aise aage: Har boxed part ek abhi-tak-unknown answer hai jiska paused call wait kar raha hai.

KYUN. Ek call tabhi return kar sakti hai jab uska sub-call answer de. Toh poori chain neeche jaate hue freeze ho jaati hai — yeh descent winding phase hai. Importantly, har frame apna own private rakhta hai ( wala frame aur wala frame saath exist karte hain — yeh shared nahi hain).

PICTURE. Chaar sticky-notes stacked, top = most recent (fact(0)), har note apna private aur upar wali note ki taraf "waiting for ..." arrow dikhata hai.

Figure — Recursion — call stack visualization, base case, recursive case

Step 5 — Base case land karta hai

KYA. Top frame fact(0) hai. Yeh n == 0 match karta hai, toh yeh immediately return karta hai — koi naya frame nahi, koi multiplication nahi.

KYUN. Yeh ek akeela moment hai jahan recursion thin air se value produce karti hai. Is line ke bina pile Python ke depth limit (~1000) ke baad bhi badhti rahegi aur RecursionError se crash kar degi. Base case winding aur unwinding ke beech ka hinge hai.

PICTURE. Top sticky-note flip hoti hai aur green "1" reveal hoti hai, poore pile mein pehli concrete value.

Figure — Recursion — call stack visualization, base case, recursive case

Step 6 — Unwinding: wapas upar jaate hue multiply karo

KYA. Ab top se notes peel karo (LIFO) aur har ek ko uski paused multiplication finish karne do, upar se milne wale answer ka use karke:

KYUN. Kyunki sabse gehri (last-pushed) frame pehle finish hoti hai, multiplications outside-in on the way up hoti hain — yeh ordering LIFO se force hoti hai, humari choice se nahi. fact(3) last mein complete hota hai aur final deliver karta hai.

PICTURE. Stack neeche shrink ho raha hai, ek value hand-over-hand climb karti hai jaise har frame pop hota hai.

Figure — Recursion — call stack visualization, base case, recursive case

Step 7 — Degenerate aur edge inputs

KYA aur KYUN, case by case:

  • — sabse chota legal input. Pehli hi call mein base case hit hota hai. Pehle frame ke baad zero frames stack hote hain; answer instantly return hota hai. Isliye humne choose kiya ( nahi) base ke liye — function bina kisi special-casing ke apne floor par correct hai.
  • — floor ke ek step upar. fact(0) tak ek baar winds karta hai, ek baar unwinds: . ✅ (Sahi: .)
  • — woh trap. fact(-1) try karo: yeh hai? Nahi. Kya yeh hai? Nahi. Toh yeh base case skip karta hai aur fact(-2) call karta hai, phir fact(-3), … hamesha ke liye. Pile overflow ho jaata hai → RecursionError. Lesson: tumhara base case har woh path catch karna chahiye jo shrinking le ja sakti hai. Ek safer guard hai if n <= 0: return 1.

PICTURE. Teen mini-stacks side by side: fact(0) (ek note, instant), fact(1) (do notes), aur fact(-1) (ek hamesha barhta red tower jo ceiling ke through crash karta hai).

Figure — Recursion — call stack visualization, base case, recursive case

Ek-picture summary

Poori kahaani ek V-shape mein: left arm se neeche frames wind karte hain (har ek pausing, har ek apna rakhte hue), base case V ke bottom par baitha hai, aur right arm se upar unwind karte hain, multiply karte hue.

Figure — Recursion — call stack visualization, base case, recursive case
Recall Feynman: plain words mein poora walkthrough

Tum chahte ho. Tum ise directly compute nahi karte — tum kehte ho " sirf times hai", aur ek sticky-note pin karte ho yaad dilane ke liye ki se baad mein multiply karna hai. paane ke liye tum kehte ho "woh times hai" — ek aur note. ke liye: " times " — ek aur note. Ab woh hai jo tum cold jaante ho: woh hai, koi sochna nahi. Yahi base case hai, woh ground jis ki taraf tum neeche chal rahe the. Ab notes ko top se reverse mein peel karo: , phir , phir . Neeche jaate hue tumne sirf promises kiye (winding); wapas upar aate hue tumne unhe cash kiya (unwinding). Promises ka pile call stack tha, aur kyunki tum hamesha pehle top note peel karte ho — woh akhri jo tumne pin ki — sabse gehri call pehle finish hoti hai. Function ko ek negative number do aur koi ground nahi hoti land karne ke liye: tum notes pin karte raho jab tak wall nahi khatam ho jaati. Woh crash ek RecursionError hai.


Active recall

fact(3) mein kaunsa frame pehle value return karta hai, aur kyun?
fact(0) — yeh base case hai aur last-pushed (sabse gehra) frame bhi hai, toh LIFO ise pehle pop karta hai.
Frozen expression mein, kaunsi nesting direction winding hai?
Inner-to-outer nesting winding ke dauran banti hai; inner-first evaluate karna unwinding hai.
fact(-1) return karne ki jagah crash kyun karta hai?
Yeh kabhi nahi hota, toh base case skip ho jaata hai aur hamesha-chote negatives call hote rehte hain jab tak stack overflow na ho jaaye.
Kaunsa ek change fact ko negative inputs ke against safe banata hai?
if n <= 0: return 1 use karo taaki har downward path catch ho jaaye.

Related: Iteration — for and while loops · Fibonacci and overlapping subproblems · Big-O and Recursion Depth · Memoization and Dynamic Programming · Tree and Graph Traversal