freeCodeCamp/curriculum/challenges/english/02-javascript-algorithms-an.../basic-javascript/replace-loops-using-recursi...

3.2 KiB

id title challengeType videoUrl forumTopicId
5cfa3679138e7d9595b9d9d4 Replace Loops using Recursion 1 https://www.freecodecamp.org/news/how-recursion-works-explained-with-flowcharts-and-a-video-de61f40cb7f9/ 301175

Description

Recursion is the concept that a function can be expressed in terms of itself. To help understand this, start by thinking about the following task: multiply the elements from 0 to n inclusive in an array to create the product of those elements. Using a for loop, you could do this:
  function multiply(arr, n) {
    var product = arr[0];
    for (var i = 1; i <= n; i++) {
        product *= arr[i];
    }
    return product;
  }

However, notice that multiply(arr, n) == multiply(arr, n - 1) * arr[n]. That means you can rewrite multiply in terms of itself and never need to use a loop.

  function multiply(arr, n) {
    if (n <= 0) {
      return arr[0];
    } else {
      return multiply(arr, n - 1) * arr[n];
    }
  }

The recursive version of multiply breaks down like this. In the base case, where n <= 0, it returns the result, arr[0]. For larger values of n, it calls itself, but with n - 1. That function call is evaluated in the same way, calling multiply again until n = 0. At this point, all the functions can return and the original multiply returns the answer.

Note: Recursive functions must have a base case when they return without calling the function again (in this example, when n <= 0), otherwise they can never finish executing.

Instructions

Write a recursive function, sum(arr, n), that returns the sum of the elements from 0 to n inclusive in an array arr.

Tests

tests:
  - text: <code>sum([1], 0)</code> should equal 1.
    testString: assert.equal(sum([1], 0), 1);
  - text: <code>sum([2, 3, 4], 1)</code> should equal 5.
    testString: assert.equal(sum([2, 3, 4], 1), 5);
  - text: Your code should not rely on any kind of loops (<code>for</code> or <code>while</code> or higher order functions such as <code>forEach</code>, <code>map</code>, <code>filter</code>, or <code>reduce</code>.).
    testString: assert(!removeJSComments(code).match(/for|while|forEach|map|filter|reduce/g));
  - text: You should use recursion to solve this problem.
    testString: assert(removeJSComments(sum.toString()).match(/sum\(.*\).*\{.*sum\(.*\).*\}/s));

Challenge Seed

function sum(arr, n) {
  // Only change code below this line

  // Only change code above this line
}

After Test

const removeJSComments = str => str.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, '');

Solution

function sum(arr, n) {
  // Only change code below this line
  if(n <= 0) {
    return arr[0];
  } else {
    return sum(arr, n - 1) + arr[n];
  }
  // Only change code above this line
}