Files
2022-01-20 20:30:18 +01:00

3.2 KiB

id, title, challengeType, videoUrl, forumTopicId, dashedName
id title challengeType videoUrl forumTopicId dashedName
5cfa3679138e7d9595b9d9d4 再帰を使用してループを置き換える 1 https://www.freecodecamp.org/news/how-recursion-works-explained-with-flowcharts-and-a-video-de61f40cb7f9/ 301175 replace-loops-using-recursion

--description--

関数が自分自身を呼び出せるという概念のことを再帰といいます。 再帰を理解するために、次の作業について考えてみましょう。配列の最初の n 個の要素を掛け合わせて、それらの要素の積を生成するとします。 これは次のように for ループを使用して記述できます。

  function multiply(arr, n) {
    let product = 1;
    for (let i = 0; i < n; i++) {
      product *= arr[i];
    }
    return product;
  }

しかし、ここで multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1] であることに注目してください。 つまり、multiply を自分自身で書き換えることが可能で、ループを使用する必要はありません。

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

multiply の再帰バージョンを詳しく説明すると次のようになります。 基準ケースn <= 0 であり、1 を返します。 n の値がこれより大きい場合、関数は n - 1 を引数に取って自分自身を呼び出します。 この関数呼び出しは同じ方法で評価され、n <= 0 となるまで、multiply を呼び出し続けます。 n <= 0 になった時点で、すべての関数が処理を返し、最初の multiply が答えを返します。

注: 再帰関数では、関数の呼び出しをせずに制御を返す条件となる基準ケースを設定しておく必要があります (たとえば、この例では n <= 0)。これがないと再帰を無限に繰り返してしまいます。

--instructions--

再帰関数の sum(arr, n) を記述してください。この関数は配列 arr の最初の n 個の要素の合計を返します。

--hints--

sum([1], 0) は 0 と等しくなる必要があります。

assert.equal(sum([1], 0), 0);

sum([2, 3, 4], 1) は 2 と等しくなる必要があります。

assert.equal(sum([2, 3, 4], 1), 2);

sum([2, 3, 4, 5], 3) は 9 と等しくなる必要があります。

assert.equal(sum([2, 3, 4, 5], 3), 9);

このコードには、どのような種類のループ (forwhile、または forEachmapfilterreduce のような高階関数) も使用しないでください。

assert(
  !code.match(/for|while|forEach|map|filter|reduce/g)
);

この課題の解決には、再帰を使用してください。

assert(
  sum.toString().match(/sum\(.*\)/g).length > 1
);

--seed--

--seed-contents--

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

  // Only change code above this line
}

--solutions--

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