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

JavaScriptで数値がフィボナッチ数列に含まれるか判定する方法


JavaScriptでは、受け取った数値がフィボナッチ数列に含まれているかどうかを判定し、その結果をブール値(true / false)で返す関数を実装する必要がある場面は少なくありません。

コード例

実際のコードは以下のとおりです −

const num = 89;

const isFib = query => {
   // 0 と 1 は定義上フィボナッチ数
   if(query === 0 || query === 1){
      return true;
   }
   let prev = 1;
   let count = 2;
   let temp = 0;
   while(count <= query){
      if(prev + count === query){
         return true;
      }
      temp = prev;
      prev = count;
      count += temp;
   }
   return false;
};

console.log(isFib(num));

出力

コンソールには次のように表示されます −

true

仕組みの解説

この関数は、フィボナッチ数列を先頭から順番に生成しながら、対象の数値と一致するかどうかを確認していきます。変数 prevcount はそれぞれ「1つ前の項」と「現在の項」を表しており、両者の和が目的の数値と一致すれば true を返します。そして count が目的の数値を超えた時点で、それ以降に一致する項は存在しないため、ループを抜けて false を返します。

なお、元のコードではループ条件の記述に誤りがあり、意図したとおりに動作しないケースがあったため、ここでは条件を count <= query に修正しています。

別のアプローチ:数学的な性質を利用する

フィボナッチ数には「整数 n がフィボナッチ数であるのは、5n² + 4 または 5n² − 4 のいずれかが完全平方数になるとき、かつそのときに限る」という有名な性質があります。これを利用すれば、ループ処理を一切使わずに簡潔に判定できます。

const isPerfectSquare = x => Number.isInteger(Math.sqrt(x));

const isFibo = n => {
   if(n < 0) return false;
   const t = 5 * n * n;
   return isPerfectSquare(t + 4) || isPerfectSquare(t - 4);
};

console.log(isFibo(89));  // true
console.log(isFibo(90));  // false

大きな数値を扱う場合や同じ判定を何度も行う場合には、こちらの数学的アプローチの方がより効率的です。


  1. JavaScriptで小数を検証するには?正規表現を使った実装例を解説

    JavaScriptで小数を検証する方法 JavaScriptで、ユーザーが入力した値が正しい小数(小数点を含む数値)かどうかを判定したい場面はよくあります。そんなときに便利なのが正規表現です。本記事では、match()メソッドと正規表現を組み合わせて、入力値が小数かどうかを検証する方法を、具体的なコード例とともにわかりやすく解説します。 使用する正規表現パターン 今回の検証では、以下の正規表現を使用します。 /^[-+]?[0-9]+\.[0-9]+$/ このパターンの各要素の意味は次のとおりです。 ^[-+]?:文字列の先頭に符号(+ または -)が付いていても、付いていなくてもマッチ

  2. JavaScriptで数字パターンを表示する方法【初心者向けサンプルコード】

    本記事では、テキスト入力欄とボタンを備えたJavaScript・HTMLプログラムの作成方法を解説します。ユーザーが入力欄に任意の数値(例:5)を入力してボタンをクリックすると、画面に以下のような数字パターンが表示される仕組みです。(n = 5 の場合の出力例)01 01 02 01 02 03 01 02 03 04 01 02 03 04 05仕組みのポイントこのパターンは二重ループ(ネストしたforループ)を使うことで実現できます。外側のループが「行」を制御し、内側のループがその行に表示する「数字の個数」を制御します。i 行目には 1 から i までの数字が順番に出力されるため、行が進む