多くの場合、再帰はそれほど明白ではありません。明らかではないほど、維持するのが難しくなります。
for(i=0;i<ITER_LIMIT;i++){somefunction(i);}
メインフローで記述する場合、ループを記述していることを完全に明確にします。書いたとしてsomefunction(ITER_LIMIT);
も、実際に何が起こるかを明確にしないでください。コンテンツのみを見る:このsomefunction(int x)
呼び出しsomefunction(x-1)
は、実際には反復を使用するループであることを示しています。また、break;
反復の途中のどこかに簡単にエスケープ条件を設定することはできません。最後まで渡される条件を追加するか、例外をスローする必要があります。(そして、例外は再び複雑さを追加します...)
本質的に、それが反復と再帰の間の明らかな選択であるならば、直感的なことをしてください。繰り返しが簡単にジョブを実行する場合、2行を保存することは、長期的に生じる可能性のある頭痛の種に値することはめったにありません。
もちろん、98行を節約できる場合は、まったく別の問題です。
再帰が単に完全に適合する状況がありますが、それは実際に珍しいことではありません。ツリー構造、多重リンクネットワーク、独自のタイプを含むことができる構造、多次元のギザギザの配列、基本的に単純なベクトルでも固定次元の配列でもないものの走査。既知の直線経路を移動する場合は、繰り返します。未知に飛び込んだら、再帰してください。
基本的に、somefunction(x-1)
レベルごとに複数回それ自体から呼び出される場合、反復を忘れてください。
...再帰によって最適に実行されるタスクの関数を繰り返し記述することは可能ですが、快適ではありません。どこで使用しようとint
、あなたはのようなものが必要ですstack<int>
。私は一度実践しましたが、実際の目的よりも演習として。そのような課題に直面したら、あなたが表明したような疑念を抱くことはありません。