再帰と末尾再帰 簡単に言えば、再帰とは関数が自分自身を呼び出すことです。プログラミング言語のアルゴリズムとして広く使用されています。中心となる考え方は、大規模で複雑な問題を段階的に元の問題に似たより小さな問題に変換して解決することです。一般的に、再帰には境界条件、再帰的な前進フェーズ、および再帰的な戻りフェーズが必要です。境界条件が満たされない場合は再帰が前進し、境界条件が満たされた場合は再帰が戻ります。 しかし、有能なプログラマーとして、再帰アルゴリズムは通常のループなどの一般的に使用されるアルゴリズムよりも効率が低いことも知っておく必要があります。したがって、より優れたアルゴリズムがない場合、または特定の状況で再帰の方が適切な場合を除き、再帰は可能な限り避けるべきです。再帰呼び出しプロセス中、システムはスタックを開いて、各レイヤーの戻りポイント、ローカル量などを保存します。再帰回数が多すぎると、スタック オーバーフローが簡単に発生する可能性があります。 このとき、末尾再帰を使用する必要があります。つまり、関数内のすべての再帰呼び出しは、関数の最後に表示されます。末尾再帰の場合、呼び出しレコードは 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 番目は識別子です。識別子によって、生成されたブランチのスタイルが決まります。さまざまなスタイルをカスタマイズできます。 |
>>: 時代遅れにならないで、機械学習プラットフォームこそが未来だ
[原文は51CTO.comより] 8月22日、インテルとToutiaoの共同戦略協力記者会見と「デー...
スタンフォード大学の「エビフライと皿洗い」ロボットとほぼ同時に、 Google DeepMindも最...
偽の肖像ビデオ生成技術は、政治宣伝、有名人のなりすまし、証拠の捏造、その他のアイデンティティ関連の操...
ディープラーニングツールディープラーニングの進歩は、ソフトウェア インフラストラクチャの進歩にも大き...
人工知能といえば、映画「アイアンマン」に登場する賢い執事ジャービスを思い浮かべる人もいるかもしれませ...
Theano、TensorFlow、Torch、MXNetから最近人気のPyTorchなど、ディープ...
現在、業界のビジュアル AI に対する焦点は最先端技術から産業エコロジーへと移行しており、これはビ...
AIは現在どのように発展しているのでしょうか?テクノロジーの発展があまりにも速く、人工知能があらゆ...
著者の個人的な考え自動運転の分野では、BEV ベースのサブタスク/エンドツーエンド ソリューションの...
ちょうど昨日、米国議会は、米国政府が不時着したエイリアンの宇宙船とエイリアンの遺体を発見し、それを隠...
5年前(2019年1月)、Nature Machine Intelligenceが設立されました。...
【51CTO.comオリジナル記事】 1. 前に書く5Gは2019年上半期の輝く「星」と言えるが、...