JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで増加する三角形のn行目の全数値の合計を求める方法

増加する三角形とは

この問題における「増加する三角形」とは、次のような形の三角形を指します。

    1
   2 3
  4 5 6
7 8 9 10

ご覧のとおり、各行には連続する自然数が左から右へと順に配置され、行が下に進むほど要素の数が1つずつ増えていきます。

問題の概要

数値 n を受け取り、増加する三角形の n 行目に含まれるすべての数値の合計を返すJavaScript関数を作成する必要があります。

例えば15行目の場合、その行には105から120までの連続する15個の数値が含まれており、それらの合計は1695となります。

解法:コード例

以下が実際のコードです。

const num = 15;
const rowSum = (num = 1) => {
   const arr = [];
   const fillarray = () => {
      let num = 0;
      for(let i = 1; i <= 10000; i++){
         const tempArr = [];
         for(let j = 0; j < i; j++){
            num++;
            tempArr.push(num)
         };
         arr.push(tempArr);
      };
   };
   fillarray()
   return arr[num-1].reduce((a, b)=>a + b, 0);
};
console.log(rowSum(num));

コードの解説

このコードでは、まず fillarray 関数を使って10000行分の三角形データを配列として生成しています。内側のループで連番を振りながら各行の配列を作成し、それらを arr に格納していきます。その後、指定された行(num - 1 番目)の配列に対して reduce メソッドを適用し、すべての要素の合計を計算して返します。

出力結果

1695

より効率的な方法:数学的な公式を使う

上記の方法は直感的でわかりやすい反面、大量の行データを事前に生成するため、メモリや処理時間の面で非効率です。実は、n行目の合計は次の公式で直接求めることができます。

sum = n × (n² + 1) / 2

n行目には n(n−1)/2 + 1 から n(n+1)/2 までの連続する n 個の数値が含まれるため、等差数列の和の公式を適用するとこの式が導かれます。

const rowSumEfficient = (n = 1) => {
   return n * (n * n + 1) / 2;
};
console.log(rowSumEfficient(15)); // 1695

この方法であれば、どれほど大きな n が与えられても、ループ処理なしに定数時間 O(1) で答えを算出できます。実務においては、こちらのアプローチを採用するのが望ましいでしょう。

  1. JavaScriptでパスカルの三角形のn行目の要素を求める方法

    パスカルの三角形とは パスカルの三角形は、前の行の隣接する要素同士を足し合わせていくことで構成される、三角形状の数列配置です。各行の両端は必ず1となり、内側の各要素はそのすぐ上にある2つの要素の和になります。 パスカルの三角形の最初のいくつかの要素は以下の通りです。 求めるもの 今回は、正の整数 num を唯一の引数として受け取り、パスカルの三角形の num 行目に存在するすべての要素を配列として返すJavaScript関数を作成します。 たとえば、入力が次の場合: const num = 9; 期待される出力は以下のようになります。 const output = [1, 9, 36, 8

  2. JavaScriptで長方形内に埋め込まれた正方形の周囲長の合計を求める方法

    問題 下図のように、1つの長方形の中に正方形が5つ埋め込まれている状況を考えてみましょう。 このとき、それぞれの正方形の周囲長は次のようになります。 4 + 4 + 8 + 12 + 20 = 48 単位 一見すると複雑な計算が必要そうに思えますが、よく観察すると各正方形の一辺の長さがフィボナッチ数列(1, 1, 2, 3, 5, ...)に従っていることが分かります。つまり、n個の正方形が埋め込まれている場合、周囲長の合計は「最初のn項のフィボナッチ数の総和 × 4」で求められるのです。 そこで本記事では、数値 n を引数として受け取り、n個の正方形が埋め込まれた場合の周囲長の合計を返す