私は現在、自分自身をプログラミングすることを教えています。私は再帰関数に導入されました。私はそれらの背後にある基本的な原則を理解していますが、再帰関数を含むコードを読み込もうとすると、それらをトレースするのが難しくなります。正直なところ、私が全機能を紙に書き留めて手作業でそれをフォローしていないと、それがどういうことを理解できないのか、それに続くことはできません。あなたはそれを精神的に行う方法についていくつかのヒントを教えてください。私はかなり平均的なインテリジェントな(IQ 117)、多分それは問題ですか?前もって感謝します。再帰関数を正しく読み取る
答えて
これは素晴らしい質問だと思います。多くの人が再帰関数のコールスタックに従うことを間違えていますが、これは間違ったアプローチです。
唯一の方法は、書かれたものを見て、それが論理的に正しいかどうか、そしてそれが終了するかどうかを尋ねることです。それらの事実が真実なら、それはうまくいくだろうし、あなたは本当にどのように理解する必要はありません。より詳細には
:
- が考慮されるすべての可能な入力値はありますか?
- いずれの場合もステートメントは真ですか?
- 関数が繰り返し発生しない時点(存在する)の値はありますか?
- 残りの入力値はすべて最終的にその値になりますか?例えば
(擬似コード):
factorial(n):
if (n < 0) throw InvalidArgument
if (n == 0) return 1
else return factorial(n - 1) * n
すべての入力値が覆われています。ステートメントは真です。再帰しない値(< = 0)があり、終了値に達するまで残りのすべての値が1ずつ減少します。したがって、それは動作します。
もちろん、あなたの考えに間違いを感じるかもしれません。優れたIQがここで役立ちます。ある時点で、トレースやデバッグに頼って仮定を確認し、ロジックにエラーを見つける必要があるかもしれませんが、これは最初のアプローチではありません。
これは再帰的ソリューションの美しさです。手順上の指示ではなく、実際のステートメントになりがちです。
ありがとうございます。だから、本質的に、私はばかげていない、私は間違ったアプローチを使用していた、右か? –
はい - 確かに!この場合に行うインテリジェントな作業は、アルゴリズムの基本的な正確さを理解し、すべての実行パスを試してみることではありません。それが貴重だと思うなら、答えをアップアップしてください。 – rghome
IQは関係ありません。とにかく、私はそれがすべて練習だと思う。いくつかの再帰関数を記述してみてください。多くの練習や経験を経て、理解しやすくなります。
good ideasがあります。 幸運。
- 1. F#再帰メンバ関数:「正しく定義する方法」
- 2. 存在関数を再帰的に正しく書き込む
- 3. Sudoku C再帰関数が正しく機能しない
- 4. php再帰関数が正しく機能しない
- 5. 再帰的フォルダの読み取りC++
- 6. 再帰関数が正しく呼び出されない
- 7. Python2.7でファイルを読み込むための再帰関数
- 8. テール再帰(@tailrec)再帰関数対非再帰関数スカラースタックオーバーフローエラー?
- 9. Elixir Phoenix再帰関数はページ読み込みを停止します
- 10. 再帰関数
- 11. 再帰関数
- 12. 再帰関数
- 13. 再帰関数
- 14. 再帰関数。 、
- 15. 再帰関数?
- 16. tableView.reloadData()データを正しく再読み込みするには?
- 17. テキストファイルから数字を正しく読み取る方法は?
- 18. フォルダを持つディレクトリを再帰的に読み取る
- 19. 再帰関数データ
- 20. C#再帰関数
- 21. 再帰関数チャート
- 22. 再帰フィボナッチ関数
- 23. Python再帰関数
- 24. 再帰関数(スウィフト)
- 25. 再帰関数錆
- 26. 再帰関数5
- 27. LINQ再帰関数?
- 28. 再帰関数は
- 29. 再帰ソート関数
- 30. JQuery再帰関数?
再帰は非常に頻繁に使用されるひどいツールです。 – DwB
実践、実践、実践。 –
再オープンする投票。これは、再帰を最もよく理解するための有効な質問です。答えは経験的な知識に基づいていますが、それはしばしば当てはまりますが、質問を無効にしません。 – rghome