JavaScriptの再帰処理で「+5」か「×3」の繰り返しにより特定の数に到達できるかを判定する方法
問題の概要
数値 1 からスタートして、「5を足す」または「3を掛ける」という操作を繰り返し適用することで、無限に多くの新しい数値を生成することができます。
本記事では、与えられた数値に対して、その数値を生成する一連の加算・乗算の手順が存在するかどうかを判定する関数をJavaScriptで実装します。そのような手順が存在すれば true を、存在しなければ false を返します。
例
例えば、数値 13 は「まず3を掛け、その後2回5を足す」という操作で到達できます(1 × 3 = 3 → 3 + 5 = 8 → 8 + 5 = 13)。したがって、この関数は 13 に対して true を返します。
一方、数値 15 はどのような操作の組み合わせでも到達できないため、この関数は 15 に対して false を返します。
アプローチ:再帰による探索
この問題は再帰(recursion)を使うことで解けます。現在の値から「5を足す」「3を掛ける」という2つの分岐を再帰的に試していき、目的の数値に一致する経路が1つでも見つかれば true を返します。
また、現在の値が目標の数値を超えた時点でその経路を打ち切る(枝刈りを行う)ことで、無駄な探索を省き、効率よく答えを導き出せます。
実装コード
const sequenceExists = (num, curr = 1) => {
if(curr > num){
return false;
};
if(curr === num){
return true;
};
return sequenceExists(num, curr+5) || sequenceExists(num, curr*3);
};
console.log(sequenceExists(18));
console.log(sequenceExists(15));
console.log(sequenceExists(32));
console.log(sequenceExists(167));
console.log(sequenceExists(17));
console.log(sequenceExists(1119));コードの解説
- 引数:
numは目標の数値、currは現在の値(デフォルトは開始値の 1)です。 - 枝刈り:
currがnumを超えた時点で、これ以上の操作では目標に届かないためfalseを返して探索を打ち切ります。 - ベースケース:
currがnumと一致すれば到達可能であることが確定するので、trueを返します。 - 再帰ステップ:「5を足す場合」と「3を掛ける場合」の2つの再帰呼び出しの結果を論理OR(
||)で結合します。どちらか片方でも成功すれば、全体としてtrueになります。
実行結果
コンソールへの出力は次の通りです。
true false true true false true
18(1 + 5 = 6 → 6 × 3 = 18)や 32(1 × 3 = 3 → 3 × 3 = 9 → 9 × 3 = 27 → 27 + 5 = 32)、1119 などは操作の組み合わせで到達可能ですが、15 や 17 はどのような順序で操作しても生成できません。
-
JavaScriptでボタンがクリックされたかどうかを判定する方法
JavaScriptを使えば、ボタンがクリックされたかどうかを簡単に判定できます。最も一般的な方法は、addEventListener()メソッドでクリックイベントを監視することです。以下に、ボタンのクリックを検出し、クリックされた回数を画面に表示するサンプルコードを紹介します。 サンプルコード <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1
-
【JavaScript】Enterキーが押されたかどうかを判定してコンソールに結果を表示する方法
onkeypressイベントでEnterキーの押下を検出するEnterキーが押されたかどうかを判定し、その結果をコンソールに出力するには、onkeypressイベントを使用します。まず、テキスト入力ボックスを作成してみましょう。<input id="textBox" type="text" onkeypress="return demoForEnterKey(event)"/>続いて、demoForEnterKey()関数の実装方法を見ていきましょう。Enterキーが押されたかどうかは、イベントオブジェクトのkeyCode