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