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

JavaScriptでルック・アンド・セイ数列の最初のn項を生成する方法

ルック・アンド・セイ数列とは

数学におけるルック・アンド・セイ(Look-and-Say)数列とは、次のように始まる整数列のことです。

1, 11, 21, 1211, 111221, 312211, …

この数列では、前の項の数字を音読するように読み上げ、同じ数字が連続するグループごとに「連続する個数+その数字」をつなぎ合わせることで、次の項を生成します。

1211 の次の項を具体例で確認

たとえば 1211 を読み上げると、「1が1つ、2が1つ、1が2つ」となります。これをそのまま数字で表すと、次のようになります。

11 + 12 + 21 ⇒ 111221

したがって、1211 の次の項は 111221 です。

実装の要件

今回作成するのは、数値 n を引数に取り、ルック・アンド・セイ数列の最初の n 項を要素とする配列を返す JavaScript 関数です。

コード例

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

const num = 12;
const generateSequence = (num = 1) => {
   const lookAndSay = (val) => {
      let res = '';
      let chars = (val + ' ').split('');
      let last = chars[0];
      let count = 0;
      chars.forEach(c => {
         if(c === last){
            count++;
         }else{
            res += (count + '') + last;
            last = c;
            count = 1;
         };
      });
      return res;
   }
   let start = 1;
   const res = [];
   for(let i = 0; i < num; i++){
      res.push(String(start));
      start = lookAndSay(start);
   };
   return res;
};
console.log(generateSequence(num));

コードのポイント

  • lookAndSay 関数: 数値を文字列に変換して1文字ずつ走査します。直前の文字(last)と同じならカウント(count)を増やし、異なる文字が出現した時点で「カウント+直前の文字」を結果(res)に追記していきます。
  • 番兵としての空白: (val + ' ').split('') のように末尾に空白を付加してから分割することで、最後のグループも通常どおりの処理フローで確実に結果へ反映される仕組みです。
  • 文字列での管理: ルック・アンド・セイ数列の項は桁数が爆発的に増加するため、Number 型ではなく文字列として扱うのが安全です。

出力結果

コンソールには次のような配列が出力されます。

[
   '1',
   '11',
   '21',
   '1211',
   '111221',
   '312211',
   '13112221',
   '1113213211',
   '31131211131221',
   '13211311123113112211',
   '11131221133112132113212221',
   '3113112221232112111312211312113211'
]
  1. 【初心者向け】JavaScriptのvarとletの違いを徹底解説

    JavaScriptで変数を宣言する方法は主に2つあります。「var」を使う方法と「let」を使う方法です。では、どのような場面でvarを使い、どのような場面でletを使えばよいのでしょうか。この記事では、両者の主な違いについてわかりやすく解説します。 スコープ(有効範囲)の違い letとvarの最も大きな違いは「スコープ」にあります。letで宣言された変数のスコープは、その変数が宣言されたブロック内に限定されます。一方、varで宣言された変数はグローバルスコープを持ちます。つまり、varはブロックスコープに関係なく、変数をより広い範囲で定義するキーワードだと言えます。 windowオブジ

  2. JavaScriptで数値を丸める・切り捨てる方法|Math.round()とMath.trunc()の違いと使い方

    JavaScriptには、小数を整数へ変換するためのメソッドとして、Math.round() と Math.trunc() の2つが標準で用意されています。Math.round():小数点以下を四捨五入し、最も近い整数に丸めます。例えば「3.5」は「4」に、「3.4」は「3」になります。Math.trunc():小数点以下を単純に取り除き、整数部分だけを残します。「3.9」も「3.1」もどちらも「3」になります。それぞれの特徴を踏まえながら、実際のコード例を見ていきましょう。Math.round() と Math.trunc() の違いメソッド動作例(3.999)Math.round()四捨五