再帰と末尾再帰 簡単に言えば、再帰とは関数が自分自身を呼び出すことです。プログラミング言語のアルゴリズムとして広く使用されています。中心となる考え方は、大規模で複雑な問題を段階的に元の問題に似たより小さな問題に変換して解決することです。一般的に、再帰には境界条件、再帰的な前進フェーズ、および再帰的な戻りフェーズが必要です。境界条件が満たされない場合は再帰が前進し、境界条件が満たされた場合は再帰が戻ります。 しかし、有能なプログラマーとして、再帰アルゴリズムは通常のループなどの一般的に使用されるアルゴリズムよりも効率が低いことも知っておく必要があります。したがって、より優れたアルゴリズムがない場合、または特定の状況で再帰の方が適切な場合を除き、再帰は可能な限り避けるべきです。再帰呼び出しプロセス中、システムはスタックを開いて、各レイヤーの戻りポイント、ローカル量などを保存します。再帰回数が多すぎると、スタック オーバーフローが簡単に発生する可能性があります。 このとき、末尾再帰を使用する必要があります。つまり、関数内のすべての再帰呼び出しは、関数の最後に表示されます。末尾再帰の場合、呼び出しレコードは 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 番目は識別子です。識別子によって、生成されたブランチのスタイルが決まります。さまざまなスタイルをカスタマイズできます。 |
>>: 時代遅れにならないで、機械学習プラットフォームこそが未来だ
今日、人々は仮想世界で触れることができるほぼすべてのものを作成し、さらに構築してきました。人工知能は...
イーロン・マスク氏は、わずか5年で人間の言語を無意味にすることができる技術に取り組んでいると述べてい...
[[324253]] 01 自動運転車社会科学者は、郊外化、汚染、自由、家族旅行、命の喪失、救われ...
近年、教師あり学習によるディープラーニングも大きな成功を収めています。画像分類から言語翻訳まで、その...
大きな模型ブームが到来し、アイアンマンのジャービスが最も忙しい「マーベルヒーロー」(手動の犬の頭)に...
翻訳者 | 朱 仙中校正 | 梁哲、孫淑娟プロジェクト紹介類似画像検索とは、関連するあらゆる画像を検...
1月8日、OpenAIのCEOサム・アルトマン氏は、タイム誌編集長とのインタビューで、昨年末に同社と...
2月2日、マイクロソフトのソフトウェアエンジニアリング部門のマネージャーであるシェーン・ジョーンズ...
Foundry の 2023 年 AI 優先事項調査では、組織内で AI および AIGC テクノ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
本論文では、研究者らは報酬空間を探索するための新しいアルゴリズム RPG (報酬ランダム化ポリシー勾...
データ構造はソフトウェア開発の最も基本的な部分であり、プログラミングの内部的な強さを反映しています。...
多くの場合、さまざまな組織がさまざまな方法で生成 AI テクノロジーを適用しますが、それがもたらす悪...