What is recursion and when is it useful? Recursion क्या है और कब useful है?
Recursion is a programming technique where a function calls itself to solve a problem by breaking it down into smaller subproblems. The function must have a base case to stop recursion.
// Factorial - classic recursion example
function factorial(n) {
// Base case - stops recursion
if (n <= 1) return 1;
// Recursive case - function calls itself
return n * factorial(n - 1);
}
console.log(factorial(5)); // 5 * 4 * 3 * 2 * 1 = 120
// Fibonacci sequence
function fib(n) {
// Base cases
if (n <= 1) return n;
// Recursive case
return fib(n - 1) + fib(n - 2);
}
console.log(fib(6)); // 8
// Tree traversal - very useful for recursion
const tree = {
value: 1,
left: {
value: 2,
left: { value: 4 },
right: { value: 5 }
},
right: {
value: 3,
left: { value: 6 },
right: { value: 7 }
}
};
function traverse(node) {
if (!node) return;
console.log(node.value);
traverse(node.left);
traverse(node.right);
}
traverse(tree); // 1, 2, 4, 5, 3, 6, 7
// Problem with recursion: Performance
// fib(40) will be VERY slow because of repeated calculations
// Solution 1: Memoization (caching)
function fibMemo(n, memo = {}) {
if (memo[n]) return memo[n];
if (n <= 1) return n;
memo[n] = fibMemo(n - 1, memo) + fibMemo(n - 2, memo);
return memo[n];
}
console.log(fibMemo(40)); // Much faster!
// Solution 2: Dynamic Programming (bottom-up)
function fibDP(n) {
if (n <= 1) return n;
const dp = [0, 1];
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
// Deep copy using recursion
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) {
return obj.map(item => deepCopy(item));
}
const copy = {};
for (let key in obj) {
copy[key] = deepCopy(obj[key]);
}
return copy;
}Interview tip: Always mention the base case when explaining recursion. Discuss the performance implications (stack overflow on deep recursion) and mention optimization techniques like memoization or converting to iteration. Explain when recursion is natural and elegant (tree/graph traversal) versus when iteration is better (linear problems).
Recursion एक technique है जहाँ function अपने आप को call करके problem को smaller subproblems में break करके solve करता है। Function को base case होना ज़रूरी है recursion को रोकने के लिए।
// Factorial
function factorial(n) {
// Base case
if (n <= 1) return 1;
// Recursive case
return n * factorial(n - 1);
}
console.log(factorial(5)); // 120
// Fibonacci
function fib(n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
console.log(fib(6)); // 8
// Tree traversal
function traverse(node) {
if (!node) return;
console.log(node.value);
traverse(node.left);
traverse(node.right);
}
// Performance problem
// fib(40) बहुत slow है
// Solution: Memoization
function fibMemo(n, memo = {}) {
if (memo[n]) return memo[n];
if (n <= 1) return n;
memo[n] = fibMemo(n - 1, memo) + fibMemo(n - 2, memo);
return memo[n];
}
console.log(fibMemo(40)); // Fast!
// Deep copy
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) {
return obj.map(item => deepCopy(item));
}
const copy = {};
for (let key in obj) {
copy[key] = deepCopy(obj[key]);
}
return copy;
}इंटरव्यू टिप: हमेशा base case का ज़िक्र करें recursion explain करते समय। Performance implications (stack overflow) discuss करें और memoization या iteration के बारे में बताएं। समझाएं कब recursion natural है (tree traversal) और कब iteration बेहतर है।
Was this answer clear?