2017-03-08 5 views
0

私は現在、自分自身をプログラミングすることを教えています。私は再帰関数に導入されました。私はそれらの背後にある基本的な原則を理解していますが、再帰関数を含むコードを読み込もうとすると、それらをトレースするのが難しくなります。正直なところ、私が全機能を紙に書き留めて手作業でそれをフォローしていないと、それがどういうことを理解できないのか、それに続くことはできません。あなたはそれを精神的に行う方法についていくつかのヒントを教えてください。私はかなり平均的なインテリジェントな(IQ 117)、多分それは問題ですか?前もって感謝します。再帰関数を正しく読み取る

+0

再帰は非常に頻繁に使用されるひどいツールです。 – DwB

+0

実践、実践、実践。 –

+0

再オープンする投票。これは、再帰を最もよく理解するための有効な質問です。答えは経験的な知識に基づいていますが、それはしばしば当てはまりますが、質問を無効にしません。 – rghome

答えて

0

これは素晴らしい質問だと思います。多くの人が再帰関数のコールスタックに従うことを間違えていますが、これは間違ったアプローチです。

唯一の方法は、書かれたものを見て、それが論理的に正しいかどうか、そしてそれが終了するかどうかを尋ねることです。それらの事実が真実なら、それはうまくいくだろうし、あなたは本当にどのように理解する必要はありません。より詳細には

  1. が考慮されるすべての可能な入力値はありますか?
  2. いずれの場合もステートメントは真ですか?
  3. 関数が繰り返し発生しない時点(存在する)の値はありますか?
  4. 残りの入力値はすべて最終的にその値になりますか?例えば

(擬似コード):

factorial(n): 
    if (n < 0) throw InvalidArgument 
    if (n == 0) return 1 
    else return factorial(n - 1) * n 

すべての入力値が覆われています。ステートメントは真です。再帰しない値(< = 0)があり、終了値に達するまで残りのすべての値が1ずつ減少します。したがって、それは動作します。

もちろん、あなたの考えに間違いを感じるかもしれません。優れたIQがここで役立ちます。ある時点で、トレースやデバッグに頼って仮定を確認し、ロジックにエラーを見つける必要があるかもしれませんが、これは最初のアプローチではありません。

これは再帰的ソリューションの美しさです。手順上の指示ではなく、実際のステートメントになりがちです。

+0

ありがとうございます。だから、本質的に、私はばかげていない、私は間違ったアプローチを使用していた、右か? –

+0

はい - 確かに!この場合に行うインテリジェントな作業は、アルゴリズムの基本的な正確さを理解し、すべての実行パスを試してみることではありません。それが貴重だと思うなら、答えをアップアップしてください。 – rghome

0

IQは関係ありません。とにかく、私はそれがすべて練習だと思う。いくつかの再帰関数を記述してみてください。多くの練習や経験を経て、理解しやすくなります。

good ideasがあります。 幸運。