🔁
Functions & Recursion

Recursion

Function Khud Ko Call Kare
💡 Recursion Russian nesting dolls (matryoshka) kholne jaisa hai — har doll ke andar ek chhoti doll hai, jab tak sabse chhoti (base case) na mile, jiske baad sab dolls wapas band hoti jaati hain (return hota jaata hai).

Recursion tab hota hai jab ek function khud ko call karta hai, usually chhote input ke saath, jab tak ek "base case" na aa jaaye jaha function bina khud ko call kiye seedha answer de de. Har recursive function ke do zaroori hisse hain: base case (ruko yahan) aur recursive case (khud ko chhote problem ke saath call karo).

Internally, har recursive call apna naya stack frame banata hai (apni local variables ke saath) — jab base case hit hota hai, saare calls "unwind" hote hain (return karte hain) reverse order mein. Bina base case ke, recursion infinite chalega aur stack overflow karega.

int factorial(int n) {
  if (n <= 1) return 1;         // base case
  return n * factorial(n - 1);  // recursive case
}

int main() {
  printf("%d\n", factorial(5)); // 5*4*3*2*1 = 120
  return 0;
}

// Call stack: factorial(5) -> factorial(4) -> ... -> factorial(1)
// Phir unwind: 1 -> 2*1=2 -> 3*2=6 -> 4*6=24 -> 5*24=120
🔁
Recursion Russian nesting dolls (matryoshka) kholne jaisa hai — har doll ke andar ek chhoti doll hai, jab tak sabse chhoti (base case) na mile, jiske baad sab dolls wapas band hoti jaati hain (return hota jaata hai).
1 / 6
⚡ Quick Recap
  • Har recursion mein base case (rukna) aur recursive case (khud ko call karna) zaroori
  • Har call ka apna stack frame hota hai
  • Bina base case = infinite recursion = stack overflow
On this page (2 subtopics)

Har recursive solution ko loop (iterative) se bhi likha ja sakta hai, aur usually iteration zyada efficient hoti hai (koi function-call overhead nahi, koi stack-overflow risk nahi). Recursion tab better lagta hai jab problem khud "recursively defined" ho — jaise tree traversal, ya divide-and-conquer algorithms (merge sort, quick sort).

// Recursive:
int factorialR(int n) {
  if (n <= 1) return 1;
  return n * factorialR(n - 1);
}

// Iterative (same result, koi extra stack frames nahi):
int factorialI(int n) {
  int result = 1;
  for (int i = 2; i <= n; i++) result *= i;
  return result;
}
💡Tip: Interview mein aksar pucha jaata hai "recursion ko iteration mein convert karo" — factorial, fibonacci jaise simple cases mein loop hamesha possible hai aur performance ke liye better hai.

Tail recursion ek special case hai jaha recursive call function ka SABSE AAKHRI operation hai (uske baad kuch aur calculate nahi hota). Kuch compilers ise automatically loop mein convert kar dete hain ("tail call optimization"), stack frames bachate hue — lekin C mein ye guarantee nahi hai (compiler-dependent).

// NOT tail recursive — multiplication call ke BAAD hoti hai:
int factorial(int n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);  // call ke baad multiply karna hai
}

// Tail recursive — call hi last operation hai:
int factorialTail(int n, int acc) {
  if (n <= 1) return acc;
  return factorialTail(n - 1, acc * n);  // koi kaam call ke baad nahi
}
⚠️Common Mistake: C standard tail-call optimization guarantee nahi karta (Java/C++ compilers ki tarah) — bade n ke liye tail-recursive C code bhi stack overflow kar sakta hai agar compiler optimize na kare.