再帰と末尾再帰 簡単に言えば、再帰とは関数が自分自身を呼び出すことです。プログラミング言語のアルゴリズムとして広く使用されています。中心となる考え方は、大規模で複雑な問題を段階的に元の問題に似たより小さな問題に変換して解決することです。一般的に、再帰には境界条件、再帰的な前進フェーズ、および再帰的な戻りフェーズが必要です。境界条件が満たされない場合は再帰が前進し、境界条件が満たされた場合は再帰が戻ります。 しかし、有能なプログラマーとして、再帰アルゴリズムは通常のループなどの一般的に使用されるアルゴリズムよりも効率が低いことも知っておく必要があります。したがって、より優れたアルゴリズムがない場合、または特定の状況で再帰の方が適切な場合を除き、再帰は可能な限り避けるべきです。再帰呼び出しプロセス中、システムはスタックを開いて、各レイヤーの戻りポイント、ローカル量などを保存します。再帰回数が多すぎると、スタック オーバーフローが簡単に発生する可能性があります。 このとき、末尾再帰を使用する必要があります。つまり、関数内のすべての再帰呼び出しは、関数の最後に表示されます。末尾再帰の場合、呼び出しレコードは 1 つしかないため、「スタック オーバーフロー」エラーは発生しません。
最大で n 個のコールスタックを保存する必要があり、その複雑さは O(n) です。末尾再帰を使用する場合:
この時点では、保存する必要がある呼び出しスタックは 1 つだけであり、複雑さは O(1) です。今回の事例を通じて、その本質が徐々に理解できたでしょうか?次に、再帰アプリケーションのよく使われる事例をいくつか紹介し、その後、この記事のタイトルで説明したツリーを実装していきます。 再帰の一般的な応用例 1. 配列の合計 指定された配列 arr について、arr 内のすべての項目の合計を計算します。
このメソッドは、配列パラメータと初期値(配列の最初の項目)を関数に渡し、反復処理を通じて配列の合計を実装します。 2. フィボナッチ数列 フィボナッチ数列は黄金比数列とも呼ばれ、1、1、2、3、5、8、13、21、34、... という数列を指します。数学では、フィボナッチ数列は次のように再帰的に定義されます。F(1)=1、F(2)=1、F(n)=F(n-1)+F(n-2)(n>=3、n∈N*)。フィボナッチ数列は、現代物理学、準結晶構造、化学などの分野に直接応用されています。次に、js を使用して n 番目のフィボナッチ数を見つけるメソッドを実装します。
末尾再帰最適化関数からは、関数自体が呼び出されるたびに更新された初期値と最終結果が渡され、バックトラックによって最終結果が得られることがわかります。 3. 階乗 階乗については上で説明しました。確認したい場合は、上にスクロールしてください。 4. 省と市のカスケード多階層連携 省市カスケード多階層リンク方式の本質は、構造化されたデータ構造を生成することです。elementやantdには対応する実装があるので、ここでは詳しく紹介しません。 5. ディープコピー ディープコピーの例は誰もがよく知っているので、ここでは単純な実装のアイデアを示します。
6. はしご問題 全部で n 段の階段があります。一度に上れるのは 1 段か 2 段だけです。この階段を上るには、何通りの方法があるでしょうか。
7. オブジェクトデータのフォーマット この質問は、私が Alibaba で面接を受けたときの筆記試験の質問でした。質問は、「サーバーがネストされたオブジェクトを返す場合、オブジェクトのキー名の大文字と小文字は不明です。キー名を小文字で統一するにはどうすればよいですか?」というものでした。
具体的なプロセスや考え方はコード内に注釈が付けられています。興味があれば、自分で勉強することもできます。 8. ディレクトリを走査/削除する ここではディレクトリを削除するために node を使用します。既存の node API にはディレクトリを削除する機能がありますが、ディレクトリ内にファイルやサブディレクトリがある場合、fs.rmdir && fs.rmdirSync ではそれらを削除できません。そのため、まずディレクトリ内のファイルを削除してから、フォルダを削除する必要があります。
9. フラクタルグラフィックを描く 再帰を使用すると、グラフィックスの自由度が高まりますが、これが最善の選択ではないことに注意してください。 いくつかのツールと再帰的な思考を使用することで、上記のフラクタル パターンを実現できます。 10. 配列のフラット化 配列のフラット化とは、次の例に示すように、ネストされた配列を単一の配列に拡張することを意味します。
もちろん、これは私が実装した方法の 1 つに過ぎず、他にも実装方法はたくさんあり、皆さんもぜひ試してみてください。 再帰を使用してカスタムスタイルの構造ツリーを描画する 上記の紹介を通じて、再帰とその応用の基本的な概念を皆さんは理解できたと思います。次に、再帰を使用して構造ツリーを描く方法を段階的に説明します。効果画像: この図は、ディレクトリ構造に基づいて生成されたディレクトリ ツリー図です。多くのアプリケーション シナリオで広く使用されています。次に、その実装プロセスを見てみましょう。
Test は、次のように構築したテスト ディレクトリです。 わずか 12 行のコードで構造ツリーを生成する小さなアプリケーションを実装しました。再帰は興味深いと思いませんか? この関数では、最初のパラメーターはディレクトリの絶対パスで、2 番目は識別子です。識別子によって、生成されたブランチのスタイルが決まります。さまざまなスタイルをカスタマイズできます。 |
>>: 時代遅れにならないで、機械学習プラットフォームこそが未来だ
先日開催された2018年上海世界モバイル大会で、中国移動は2020年までに5Gネットワークの正式...
Apriori アルゴリズムと比較すると、FP-growth アルゴリズムではデータベースを 2 回...
[[395482]] [51CTO.com クイック翻訳]近年、人工知能 (AI) と機械学習 (M...
[[374681]]機械との競争から第二次機械革命へ人工知能革命は第四次産業革命と呼ばれています。第...
1. 要件の説明長い文字列と短い文字列を入力し、短い文字列に現れる文字を長い文字列から削除するプログ...
今日、ますます多くの企業が人工知能プロジェクトを立ち上げていますが、成功しないプロジェクトもあります...
AIとビッグデータの時代に、最初の開発言語となるのは誰でしょうか?これは議論の余地のない質問です。...
導入現在、HBase を搭載した最新の製品では、HBase の読み取りおよび書き込みパフォーマンスに...
芸術作品の分類と分析は難しいことで知られており、ごく少数の専門家だけが発言権を持ち、この分野への人工...
[51CTO.com からのオリジナル記事] インターネットの継続的な更新と反復により、ネットワーク...
情報化建設の加速に伴い、ネットワークセキュリティは情報化時代のホットな話題となり、国民の関心と注目を...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
これまで、AI への投資のほとんどは、大規模なデータセンター内でテクノロジーを実行することに重点を置...