web-dev-qa-db-ja.com

再帰について学ぶための優れたリソース

重複の可能性:
再帰の理解を向上させるためのリソース?

私は2年の経験を持つプログラマーであり、再帰に関する特定の問題を解決できると思うこともありますが、ほとんどの場合、惨めに失敗します。

再帰についての知識を学び、リフレッシュし、深めるためのリソースについて、できれば次のことをアドバイスしてください。

  • 再帰をいつ使用できるかを特定するのに役立ちます。
  • 実用的な例(現代のプログラミング言語に適用)。
  • リファレンスハンドブック。
  • ソースコード。
2
Kenny Meyer

再帰をいつ使用するかを見つけることは、実際には非常に簡単です-重要な概念は、問題の一部は問題全体のより小さなバージョンですであることに気づくことです。例:

  • リストの最初の要素で何かを実行し、リストの残りの部分で関数を再帰的に呼び出すことで結果を得ることができる場合、リストの関数は再帰を使用して記述できます。ここで、「問題全体の小さいバージョン」は、最初の要素を除くリストの残りの部分です。
  • バイナリツリーで動作する関数は、ツリーの左半分とツリーの右半分で関数を再帰的に呼び出し、その結果を何らかの方法で組み合わせると、再帰を使用できることがよくあります。ここで、「問題全体の小さいバージョン」は、左右のサブツリーです。
  • 再帰的に定義された数学関数(たとえば、フィボナッチ数を生成する関数F(n) = F(n-1) + F(n-2))には、数学的な定義を反映した単純な再帰的実装が含まれていることがよくあります。ここで、「問題全体の小さいバージョン」は、フィボナッチ数列の前の2つの数値です。

再帰について本当に学びたい場合は、関数型言語を選択することをお勧めします。再帰型は関数型言語の自然なプログラミングスタイルであり、「命令型」ソリューションに頼るのを避けられます。特にLISP-1(SchemeやClojureなど)をお勧めします。リストで定義されている再帰関数のいくつかはすばらしいものです。

2
mikera

私は再帰特有の本を知りませんが、アルゴリズム本のほとんどすべてのイントロで完全にカバーされています。

再帰を使用できる限り、couldは実質的にすべてのアルゴリズムで使用できます。一部の関数型プログラミング言語では、必須他の言語がループを使用するものに再帰を使用します。再帰を練習したい場合は、関数型言語を学ぶことは良いステップであり、チュートリアルにはたくさんの再帰の例があります。

再帰を使用することが有益な場合は、別の質問です。 2つの状況が思い浮かびます。 1つ目は、データ構造にスタックを使用している場合です。そのような状況では、再帰を使用すると自動的にスタックが提供されるため、これらの詳細について心配する必要はありません。もう1つの状況は、ネストされたループが多数ある場合、または不明なレベルのネストがある場合です。再帰により、ループのネストが非常に簡単になります。

再帰を理解する秘訣は、スタック全体を頭の中に保持しようとしないことです。一度に1つの小さな部分にのみ焦点を当てます。あなたの現在の状態について考え、より深いレベルが宣伝どおりに機能していることを信頼してください。

4
Karl Bielefeldt