
比較表
比較基準 | 再帰 | 繰り返し |
---|---|---|
基本 | 関数本体内の文は、関数自体を呼び出します。 | 一連の命令を繰り返し実行できるようにします。 |
フォーマット | 再帰関数では、終了条件(ベースケース)だけが指定されています。 | 繰り返しには、初期化、条件付け、ループ内での文の実行、および制御変数の更新(増減)が含まれます。 |
終了 | 再帰呼び出しを実行せずに関数を強制的に戻すために、関数本体に条件ステートメントが含まれています。 | 繰り返しステートメントは、特定の条件に達するまで繰り返し実行されます。 |
調子 | 関数が(基本ケース)と呼ばれる何らかの条件に収束しない場合、無限再帰につながります。 | 繰り返し文の制御条件が偽にならない場合は、無限繰り返しになります。 |
無限の繰り返し | 無限再帰はシステムをクラッシュさせる可能性があります。 | 無限ループはCPUサイクルを繰り返し使用します。 |
適用済み | 再帰は常に関数に適用されます。 | 繰り返しは、繰り返し文または「ループ」に適用されます。 |
スタック | スタックは、関数が呼び出されるたびに新しいローカル変数とパラメータのセットを格納するために使用されます。 | スタックを使用しません。 |
オーバーヘッド | 再帰は、繰り返される関数呼び出しのオーバーヘッドを持ちます。 | 繰り返される関数呼び出しのオーバーヘッドはありません。 |
速度 | 実行が遅い | 実行が速い |
コードサイズ | 再帰はコードのサイズを縮小します。 | 反復はコードを長くします。 |
再帰の定義
C ++では、関数がそのコード内で自分自身を呼び出すことができます。 これは、関数の定義がそれ自身への関数呼び出しを所有していることを意味します。 時にはそれは「 循環定義 」とも呼ばれます。 関数が使用するローカル変数とパラメータのセットは、関数が自分自身を呼び出すたびに新しく作成され、スタックの最上位に格納されます。 しかし、関数が自分自身を呼び出すたびに、その関数の新しいコピーは作成されません。 再帰関数は、コードのサイズを大幅に縮小したり、メモリ使用率を向上させたりすることはありませんが、反復と比較するといくらか効果があります。
再帰を終了するには、関数の定義にselect文を含めて、再帰呼び出しを行わずに関数を強制的に戻すようにする必要があります。 再帰関数の定義にselect文がないと、一度呼び出された関数は無限再帰になります。
数の階乗を返す関数で再帰を理解しましょう。
int factorial(int num){int答え; if(num == 1){1を返す。 } else {answer = factorial(num-1)* num; //再帰呼び出し} return(answer); }
上記のコードでは、else部のステートメントが再帰を示しています。これは、ステートメントがその中にある関数factorial()を呼び出すときです。
繰り返しの定義
反復は、反復ステートメント内の条件が偽になるまで一連の命令を繰り返し実行するプロセスです。 反復ステートメントには、初期化、比較、反復ステートメント内でのステートメントの実行、そして最後に制御変数の更新が含まれます。 制御変数が更新された後、それは再び比較され、繰り返しステートメントの条件が偽になるまで、プロセスはそれ自身を繰り返します。 繰り返し文は、「for」ループ、「while」ループ、「do-while」ループです。
反復ステートメントは変数を格納するためにスタックを使用しません。 したがって、反復文の実行は、再帰関数に比べて高速です。 繰り返し関数でも、繰り返し実行される関数呼び出しのオーバーヘッドがないため、再帰関数よりも実行が速くなります。 制御条件が偽になると反復は終了する。 繰り返し文に制御条件がないと、無限ループになったり、コンパイルエラーが発生することがあります。
上記の例に関する繰り返しを理解しましょう。
int factorial(int num){int回答= 1; //(int t = 1; t> num; t ++)// iteration {answer = answer *(t); //初期化前にガベージ値が含まれる可能性があるため、初期化が必要です。 戻る(答) }}
上記のコードでは、関数は反復文を使用して数値の階乗を返します。
再帰と反復の主な違い
- 再帰はプログラム内のメソッドがそれ自体を繰り返し呼び出すのに対し、反復はプログラム内の一連の命令が繰り返し実行されるときです。
- 再帰的メソッドには、一連の命令、それ自体を呼び出すステートメント、および終了条件が含まれますが、繰り返しステートメントには、初期化、増分、条件、ループ内の一連の命令、および制御変数が含まれます。
- 条件文は再帰の終了を決定し、制御変数の値は反復文の終了を決定します。
- メソッドが終了条件に至らない場合、無限再帰に入ります。 一方、制御変数が終了値にならない場合は、反復文は無限に反復されます。
- 無限再帰はシステムクラッシュを引き起こす可能性がありますが、無限反復はCPUサイクルを消費します。
- 再帰は常にmethodに適用されますが、反復は命令のセットに適用されます。
- 再帰中に作成された変数はスタックに格納されますが、反復にはスタックは必要ありません。
- 再帰は繰り返し関数呼び出しのオーバーヘッドを引き起こしますが、繰り返しは関数呼び出しオーバーヘッドを持ちません。
- 関数呼び出しのオーバーヘッドにより再帰の実行は遅くなりますが、反復の実行は速くなります。
- 再帰はコードのサイズを縮小しますが、反復はコードを長くします。
結論:
再帰関数は書くのが簡単ですが、それらは反復と比較してうまく機能しません、一方、反復は書くことが難しいですが、それらのパフォーマンスは再帰と比較して良いです。