フィボナッチ数列のJavaScript出力を実装する方法

フィボナッチ数列のJavaScript出力を実装する方法

トピック

私たちが答えなければならない質問があります:

  • フィボナッチ数列の最初の 10 項、つまり 1、1、2、3、5、8、13、21、34、55 を出力してみてください。

分析する

タイトルに「フィボナッチ数列」という概念があると戸惑う人もいるかもしれませんが、戸惑う必要はありません!

この問題では、この馴染みのない概念は無視してかまいません。後ほど示される数値パターンのみに注意する必要があります。

このルールは 1 つの文で要約できることがわかります。3 番目の数字から始まり、後続の各項の値は前の 2 つの項の合計に等しくなります。式で表すと、an = an-1 + an-2 (n ≥ 2) となります。

トピックの要件によれば、実際には次の 2 つのことを行うように求められます。

  1. 各項目の値を生成します。
  2. すべての値を出力します。

基本的な解決策

解決:

  • シーケンス内の各項目の値を格納する配列を作成します。
  • for ループは、シーケンスの各項目を生成し、それを配列に格納し (後続の項目の値を計算するため)、生成された項目を出力します。

コードは次のように実装されます。

/**
 * @description シーケンス配列を生成するメソッドを作成します * @param {number} n は生成する項目の数を示します (つまり、配列の長さであり、配列の添え字ではありません)
 */
関数createFibArr(n) {
    //データを格納する配列を宣言します。let fibArr = [];
    // 3番目の項目(添え字2)から始めて、各項目は前の2つの項目の合計に等しくなります。 for (let index = 0; index < n; index++) {
        インデックス < 2 ? fibArr.push(1) : fibArr.push(fibArr[index - 1] + fibArr[index - 2]);
        コンソールにログ出力します。
    }
}

//メソッドcreateFibArr(10)を呼び出します。

分析:

これは問題を解決するための最も基本的な方法であり、簡単に実現できます。

しかし、これが面接の質問であれば、そのような答えは平凡で、何のハイライトもありません。最も重要なことは、それが私たちのユニークな気質を反映していないということです。したがって、私たちは他の手段を使って自分のスタイルを改善する必要があります。

基本的な再帰

解決:

  • 各位置に対応する値は再帰によって計算されます (ここでの前提は、最初の項目と 2 番目の項目が固定値であることです。そうでない場合、再帰はうまく機能しません)。
  • 結果を印刷します。

コードは次のように実装されます。

/**
 * @description n 番目の項目の値を計算します* @param {number} n は各項目の添字値を表します* @returns {number} 添字 n の位置の値*/
関数calFibValue(n) {
    console.count("実行回数:")
    n < 2 ? 1 の場合: (calFibValue(n - 1) + calFibValue(n - 2)) を返します。
}

/**
 * @description 計算結果を印刷します* @param {number} n は印刷する項目の数を表します*/
関数printRes(n) {
    (インデックス = 0、インデックス < n、インデックス++) {
        console.log(calFibValue(インデックス));
    }
}

//印刷メソッドを呼び出す printRes(10);

// 実行回数: 276

分析:

再帰を使用するとコードの品質は向上しますが、パフォーマンスという別の問題も発生します。

各項目の値は、最初の項目から計算され、累積されます。たとえば、4 番目の項目の値を計算するプロセスは次のとおりです。

  • 最初の項目の値 1 を返します。
  • 2 番目の項目の値 1 を返します。
  • 3 番目の項は 1 + 1 = 2 と計算されます。
  • 4 番目の項は 2 + 1 = 3 と計算されます。

5 番目の項目の値を計算するときは、上記のプロセスを使用して 4 番目の項目の値を取得する必要があり、これには多数の繰り返し操作が含まれます。

面接官に好印象を与えるためには、さらに最適化を行う必要があります。

再帰最適化

解決:

  • 再帰部分のロジックにより繰り返し計算が発生するため、最適化ポイントはここにあります。
  • 繰り返し演算があるということは、後続の演算では実際には以前に計算された値を使用する可能性があるということなので、各計算の結果を保存するためのキャッシュを導入する必要があります。

コード実装:

/**
 * @description n 番目の項目の値を計算します* @param {number} n は各項目の添字値を表します* @returns {number} 添字 n の位置の値*/

// 各計算の結果を格納する Map 構造体 // ここでは配列も使用できますが、セマンティクスの観点から、直接 Map またはオブジェクトは存在しません let fibValueMap = new Map();
関数calFibValue(n) {
    console.count("実行回数: ");
    // 対応する値がすでにキャッシュ内に存在する場合は、直接戻ります if (fibValueMap.has(n)) {
        fibValueMap.get(n) を返します。
    }
    定数値 = n < 2 ? 1 : (calFibValue(n - 1) + calFibValue(n - 2));
    // 各項目を計算した後、時間内にMapに格納する必要があります
    fibValueMap.set(n, 値);
    戻り値;
}

/**
 * @description 計算結果を印刷します* @param {number} n は印刷する項目の数を表します*/
関数printRes(n) {
    (インデックス = 0、インデックス < n、インデックス++) {
        console.log(calFibValue(インデックス));
    }
}

//印刷メソッドを呼び出す printRes(10);

// 実行回数: 26

分析:

出力されたカウントによると、最適化後の再帰回数は最適化前の約 1/10 となっており、驚くべき結果となっています。

今回は面接官も満足してくれると思います。

要約する

物事がどのように変化しても、本質は同じです。問題を解決する方法が明確であれば、コードの実装は単なる結果にすぎません。日々の仕事や勉強の中で、私たちは意識的に発散的思考を養い、問題をさまざまな角度から見る必要があります。違った景色を発見できるかもしれません。皆さんに刺激を与えられたら嬉しいです!

面接では、自分のユニークな資質を強調するため、または面接の質問に特定の要件がある場合に、一見洗練されたアイデアを使用するのは当然のことです。

ただし、日常業務では、パフォーマンスが類似していて、基本的な方法で問題を解決できる場合は、「高度な」方法を使用しないことをお勧めします。基本的な方法ではエラーが発生する可能性がはるかに小さいためです。たとえば、今日の問題では、基本的なソリューションが実際には最高のパフォーマンスを発揮します。

バグを少なく書けば、怠ける時間が増えるでしょう?

フィボナッチ数列の JavaScript 出力に関するこの記事はこれで終わりです。フィボナッチ数列の JS 出力に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScriptはdocument.write()を使用して改行を出力する
  • js ベースの段階的なテキスト出力の実装コードの例
  • 指定された文字列を繰り返し出力するための JavaScript の一般的なメソッドの概要
  • JavaScript でデータを出力する複数の方法

<<:  Django+Mysql+Redis+Gunicorn+NginxのDockerデプロイメントの実装

>>:  Mysql クラシック高レベル/コマンドライン操作 (クイック) (推奨)

推薦する

Docker コンテナ入門から夢中になるまで(推奨)

1. Docker とは何ですか?仮想マシンについては誰もが知っています。Windows に Li...

CSSスタイルのカスケーディングルールの詳細な説明

CSS スタイル ルール構文スタイルは、CSS の基本単位です。各スタイル ルールは、セレクターと宣...

HTML要素にフォーカスを設定する方法

コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...

親ページの更新を制御するために HTML で iframe を実装するためのアイデアとコード

1. 応用シナリオ親ページ a.jspサブページ b.jsp (ページ a に埋め込まれた ifra...

jsonファイルの書き方の詳細説明

目次JSONとはなぜこの技術なのでしょうか? JSONの使い方- データ形式- メモ- JSには2つ...

overflow:autoの使い方の詳しい説明

本文に入る前に、オーバーフローとフレックスレイアウトの使い方をいくつか紹介します。 overflow...

htmlハイパーリンクaのクリックイベントの後、hrefで指定されたアドレスにジャンプします。

場合によっては、ジャンプを完了するために href の代わりにハイパーリンク <a> を...

CSSのborder-radiusプロパティを使用して円弧を設定します

現象: divを一定の振幅で円、楕円などに変更する方法: CSSのborder-radiusプロパテ...

Vue.jsで実装されたカレンダープラグインの使い方を詳しく説明します

本日実装する機能は、以下の機能です。vue.js シミュレーションカレンダープラグインさて、もう無駄...

HTML テーブルタグチュートリアル (12): 境界線スタイル属性 FRAME

FRAME プロパティを使用して、表の境界線のスタイル タイプを制御します。基本的な構文<T...

Vuex のモジュール化と名前空間の例のデモ

1. 目的:コードの保守が容易になり、さまざまなデータの分類が明確になります。 2. store/i...

Linux リモート コントロール Windows システム プログラム (3 つの方法)

場合によっては、Windows システム上のプログラムを Linux 上でリモートで実行する必要があ...

Mysql が CPU を過剰に占有する場合の最適化方法 (必読)

Mysql が CPU を占有しすぎる場合、どこから最適化を開始すればよいでしょうか? CPU 使...

MYSQLは継続サインイン機能を実装しており、サインイン後1日経過すると最初から開始します(SQL文)

1. テストテーブルを作成する テーブル `testsign` を作成します ( `userid`...

LinuxはMySQLデータベースの自動バックアップとスケジュールバックアップを毎日実装しています

概要バックアップは災害復旧の基礎であり、システム操作エラーやシステム障害によるデータ損失を防ぐために...