Building Your Learning Module...
Getting things ready for you!
Find videos you like?
Save to resource drawer for future reference!
Recursion is when a function calls itself to solve a problem by breaking it into smaller, similar sub-problems. Perfect for tree structures, factorial, Fibonacci, and divide-and-conquer!
Click 'Start Animation' to visualize factorial(5)
Call stack is empty. Click Start to begin!
// Countdown with loop
function countdown(n) {
for (let i = n; i > 0; i--) {
console.log(i);
}
console.log('Done!');
}
countdown(5);
// 5 4 3 2 1 Done!
// Factorial with loop
function factorial(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
console.log(factorial(5)); // 120// Countdown with recursion
function countdown(n) {
if (n <= 0) { // Base case
console.log('Done!');
return;
}
console.log(n);
countdown(n - 1); // Recursive case
}
countdown(5);
// 5 4 3 2 1 Done!
// Factorial with recursion
function factorial(n) {
if (n <= 1) return 1; // Base case
return n * factorial(n - 1); // Recursive
}
console.log(factorial(5)); // 120
// 5 * 4 * 3 * 2 * 1 = 120Understanding the call stack
// Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13...
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(6)); // 8
// Sum of array
function sum(arr) {
if (arr.length === 0) return 0;
return arr[0] + sum(arr.slice(1));
}
console.log(sum([1, 2, 3, 4, 5])); // 15
// Power function
function power(base, exponent) {
if (exponent === 0) return 1;
return base * power(base, exponent - 1);
}
console.log(power(2, 5)); // 32
// Reverse string
function reverse(str) {
if (str === '') return '';
return reverse(str.slice(1)) + str[0];
}
console.log(reverse('hello')); // 'olleh'Nested structures
Perfect use case for recursion
// Must wait for recursive call
function factorial(n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
// ^ operation after recursion
}
// Stack grows:
// factorial(5)
// 5 * factorial(4)
// 4 * factorial(3)
// 3 * factorial(2)
// 2 * factorial(1)
// 1
// Each call must wait!// Recursion is last operation
function factorial(n, acc = 1) {
if (n <= 1) return acc;
return factorial(n - 1, n * acc);
// ^ nothing after recursion
}
// Accumulator carries result:
// factorial(5, 1)
// factorial(4, 5)
// factorial(3, 20)
// factorial(2, 60)
// factorial(1, 120)
// return 120
// Can be optimized by compiler!function countdown(n) {
console.log(n);
countdown(n - 1); // Never stops!
}
// RangeError: Maximum call stack size exceededfunction fibonacci(n) {
if (n === 1) return 1; // Missing n === 0
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci(0); // Infinite recursion!function sum(arr) {
if (arr.length === 0) return 0;
return arr[0] + sum(arr); // Not getting smaller!
}
// Infinite recursionFunction calls itself
Breaks problem into smaller parts
Critical stopping condition
Prevents infinite loops
Tree traversal, nested objects
Natural fit for hierarchical data
Each call uses memory
Watch for stack overflow