Bird
Raised Fist0
DSA Javascriptprogramming~20 mins

DP vs Recursion vs Greedy Choosing the Right Tool in DSA Javascript - Compare & Choose

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Master of DP vs Recursion vs Greedy
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Recursive Fibonacci Function
What is the output of the following JavaScript code that calculates Fibonacci numbers using recursion?
DSA Javascript
function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}
console.log(fib(5));
A5
B13
C8
D3
Attempts:
2 left
💡 Hint
Remember the Fibonacci sequence starts with 0, 1, 1, 2, 3, 5, 8...
❓ Predict Output
intermediate
2:00remaining
Output of Greedy Coin Change Algorithm
What is the output of the following JavaScript code that uses a greedy approach to make change for 27 cents with coins [25, 10, 5, 1]?
DSA Javascript
function greedyChange(amount, coins) {
  let result = [];
  for (let coin of coins) {
    while (amount >= coin) {
      amount -= coin;
      result.push(coin);
    }
  }
  return result;
}
console.log(greedyChange(27, [25, 10, 5, 1]));
A[25, 1, 1, 1]
B[10, 10, 5, 1, 1]
C[25, 5, 1, 1, 1, 1]
D[25, 1, 1]
Attempts:
2 left
💡 Hint
Greedy picks the largest coin first as many times as possible.
❓ Predict Output
advanced
2:00remaining
Output of Memoized Fibonacci Function
What is the output of this JavaScript code that calculates Fibonacci numbers using memoization (dynamic programming)?
DSA Javascript
function fibMemo(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fibMemo(n - 1, memo) + fibMemo(n - 2, memo);
  return memo[n];
}
console.log(fibMemo(10));
A34
B55
C89
D144
Attempts:
2 left
💡 Hint
Memoization stores results to avoid repeated calculations.
❓ Predict Output
advanced
2:00remaining
Output of Recursive Subset Sum Check
What is the output of this JavaScript code that checks if a subset of array sums to target using recursion?
DSA Javascript
function subsetSum(arr, target, index = 0) {
  if (target === 0) return true;
  if (index >= arr.length || target < 0) return false;
  return subsetSum(arr, target - arr[index], index + 1) || subsetSum(arr, target, index + 1);
}
console.log(subsetSum([3, 34, 4, 12, 5, 2], 9));
Atrue
Bfalse
Cundefined
DTypeError
Attempts:
2 left
💡 Hint
Check if any subset sums exactly to 9.
🧠 Conceptual
expert
2:00remaining
Choosing the Right Tool for Optimization Problems
Which approach is best suited for solving optimization problems where overlapping subproblems exist and the problem exhibits optimal substructure?
ABrute force search
BGreedy algorithm
CDynamic programming
DSimple recursion without memoization
Attempts:
2 left
💡 Hint
Think about storing results to avoid repeated work.

Practice

(1/5)
1. Which approach is best suited when a problem can be broken down into overlapping subproblems and optimal substructure?
easy
A. Dynamic Programming
B. Greedy Algorithm
C. Recursion without memoization
D. Brute Force

Solution

  1. Step 1: Understand overlapping subproblems and optimal substructure

    Dynamic Programming is designed for problems where subproblems repeat and solutions build on smaller solutions.
  2. Step 2: Compare with other approaches

    Greedy algorithms do not always consider overlapping subproblems, recursion without memoization repeats work, and brute force is inefficient.
  3. Final Answer:

    Dynamic Programming -> Option A
  4. Quick Check:

    Overlapping subproblems + optimal substructure = Dynamic Programming [OK]
Hint: Look for repeated subproblems and optimal substructure [OK]
Common Mistakes:
  • Confusing greedy with DP for overlapping subproblems
  • Ignoring memoization in recursion
  • Choosing brute force for efficiency
2. Which of the following is the correct syntax to define a recursive function in JavaScript?
easy
A. function factorial(n) { while(n > 0) return n * factorial(n - 1); }
B. function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); }
C. function factorial(n) { for(let i=0; i
D. function factorial(n) { if (n === 0) return 0; return n + factorial(n - 1); }

Solution

  1. Step 1: Check base case correctness

    function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); } returns 1 when n is 0, which is correct for factorial.
  2. Step 2: Check recursive call and return statement

    function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); } correctly multiplies n by factorial(n-1). Others have incorrect loops or wrong base cases.
  3. Final Answer:

    function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); } -> Option B
  4. Quick Check:

    Correct base case and recursive call = function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); } [OK]
Hint: Base case must stop recursion; recursive call must reduce problem size [OK]
Common Mistakes:
  • Using loops inside recursion incorrectly
  • Wrong base case value
  • Returning addition instead of multiplication for factorial
3. What will be the output of the following JavaScript code?
function fib(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}
console.log(fib(5));
medium
A. 8
B. 3
C. 5
D. 13

Solution

  1. Step 1: Understand the Fibonacci function with memoization

    fib(5) calculates the 5th Fibonacci number using memo to avoid repeated work.
  2. Step 2: Calculate fib(5) step-by-step

    fib(0)=0, fib(1)=1, fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5.
  3. Final Answer:

    5 -> Option C
  4. Quick Check:

    fib(5) = 5 with memoization [OK]
Hint: Memoization caches results to speed recursion [OK]
Common Mistakes:
  • Confusing Fibonacci index with value
  • Ignoring memo object causing slow recursion
  • Mixing up base cases
4. Find the error in this greedy algorithm code snippet for coin change problem:
function coinChange(coins, amount) {
  coins.sort();
  let count = 0;
  for (let i = coins.length - 1; i >= 0; i--) {
    while (amount >= coins[i]) {
      amount -= coins[i];
      count++;
    }
  }
  return amount === 0 ? count : -1;
}
medium
A. Return statement should always return count
B. Missing base case for amount = 0
C. Using while loop inside for loop is incorrect
D. coins.sort() sorts ascending, should sort descending

Solution

  1. Step 1: Check sorting order for greedy coin change

    Greedy coin change requires coins sorted descending to pick largest first.
  2. Step 2: Identify sorting mistake

    coins.sort() sorts ascending by default, so it should be coins.sort((a,b) => b - a).
  3. Final Answer:

    coins.sort() sorts ascending, should sort descending -> Option D
  4. Quick Check:

    Sort descending for greedy coin change [OK]
Hint: Sort coins descending for greedy coin change [OK]
Common Mistakes:
  • Using default ascending sort
  • Ignoring sorting affects greedy choice
  • Assuming while loop is wrong here
5. You want to find the minimum number of jumps to reach the end of an array where each element represents max jump length at that position. Which approach is best and why?
const arr = [2,3,1,1,4];
hard
A. Greedy, because it chooses the farthest reachable index at each step
B. Recursion without memoization, to explore all paths
C. Dynamic Programming, to store minimum jumps for each index
D. Brute force, to try every possible jump

Solution

  1. Step 1: Understand the problem nature

    Minimum jumps problem can be solved efficiently by greedy approach choosing the farthest reachable index.
  2. Step 2: Compare approaches

    Recursion without memoization and brute force are inefficient; DP is possible but greedy is optimal and simpler here.
  3. Final Answer:

    Greedy, because it chooses the farthest reachable index at each step -> Option A
  4. Quick Check:

    Minimum jumps = Greedy approach [OK]
Hint: Pick farthest reachable index greedily for minimum jumps [OK]
Common Mistakes:
  • Using recursion without memoization causing timeout
  • Overcomplicating with DP when greedy suffices
  • Trying brute force leading to inefficiency
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard