トピック私たちが答えなければならない質問があります:
分析するタイトルに「フィボナッチ数列」という概念があると戸惑う人もいるかもしれませんが、戸惑う必要はありません! この問題では、この馴染みのない概念は無視してかまいません。後ほど示される数値パターンのみに注意する必要があります。 このルールは 1 つの文で要約できることがわかります。3 番目の数字から始まり、後続の各項の値は前の 2 つの項の合計に等しくなります。式で表すと、an = an-1 + an-2 (n ≥ 2) となります。 トピックの要件によれば、実際には次の 2 つのことを行うように求められます。
基本的な解決策解決:
コードは次のように実装されます。 /** * @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)を呼び出します。 分析: これは問題を解決するための最も基本的な方法であり、簡単に実現できます。 しかし、これが面接の質問であれば、そのような答えは平凡で、何のハイライトもありません。最も重要なことは、それが私たちのユニークな気質を反映していないということです。したがって、私たちは他の手段を使って自分のスタイルを改善する必要があります。 基本的な再帰解決:
コードは次のように実装されます。 /** * @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 番目の項目の値を計算するプロセスは次のとおりです。
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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Django+Mysql+Redis+Gunicorn+NginxのDockerデプロイメントの実装
>>: Mysql クラシック高レベル/コマンドライン操作 (クイック) (推奨)
目次1. 準備1. 環境を整える2. インストール方法3. ネットワークカードの構成2. インストー...
IE9 は Microsoft の第二の革命だと言う人もいます。これは誇張ではないと思います。IE6...
目次1. はじめに2. インターフェース3. 簡単な例4. 結論1. はじめにMDN の公式 Web...
OpenShift 3.9 の最新バージョンを体験する最も早い方法。準備 [root@host ~]...
イベントバブリング、イベントキャプチャ、イベント委任JavaScript では、イベント委譲は非常に...
目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...
目次序文エラー境界エラー境界を超えてトライ/キャッチwindow.onerror、エラーイベント未処...
序文:今日、「<!DOCTYPE> タグを注意深く理解しましたか?」と尋ねられました。私...
MySQL ウィンドウ関数の紹介MySQL は MySQL 8.0 以降、ウィンドウ関数をサポートし...
以下に、トレーニング機関からのヒントと私自身の要約をいくつか示します。以下のインデックスの内容を説明...
カルーセルはフロントエンド開発において比較的重要なポイントだと思います。ネイティブjsの知識ポイント...
まとめインタビュー中、MySQL インデックスの問題について議論しているときに、B+ ツリー、B ツ...
今日は、ネイティブ JS で実装された画像マーキー効果を紹介します。効果は次のとおりです。 実装され...
実際の開発では、MySQL の主キーは重複できず、主キーが自動的にインクリメントされることがあります...
Linux ターミナルでファイルを操作しているときに、Linux コマンドライン エディターでファイ...