再帰と反復の違い

著者: Laura McKinney
作成日: 1 4月 2021
更新日: 4 5月 2024
Anonim
【アルゴリズム】再帰(前編)再帰関数
ビデオ: 【アルゴリズム】再帰(前編)再帰関数

コンテンツ


再帰と反復はどちらも命令セットを繰り返し実行します。再帰とは、関数内のステートメントがそれ自体を繰り返し呼び出す場合です。反復とは、制御条件が偽になるまでループが繰り返し実行されることです。再帰と反復の主な違いは、 再帰 常に関数に適用されるプロセスです。の 繰り返し 繰り返し実行させたい命令セットに適用されます。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表

比較の基礎再帰反復
ベーシック関数本体のステートメントは、関数自体を呼び出します。一連の命令を繰り返し実行できます。
フォーマット再帰関数では、終了条件(基本ケース)のみが指定されます。反復には、初期化、条件、ループ内のステートメントの実行、および制御変数の更新(増分および減分)が含まれます。
終了関数の本体には、再帰呼び出しを実行せずに関数を強制的に戻すための条件ステートメントが含まれています。反復ステートメントは、特定の条件に達するまで繰り返し実行されます。
調子関数が(基本ケース)と呼ばれる条件に収束しない場合、無限再帰につながります。反復ステートメントの制御条件が決して偽にならない場合、無限反復につながります。
無限の繰り返し無限再帰はシステムをクラッシュさせる可能性があります。無限ループはCPUサイクルを繰り返し使用します。
適用済み再帰は常に関数に適用されます。反復は、反復ステートメントまたは「ループ」に適用されます。
スタックスタックは、関数が呼び出されるたびに新しいローカル変数とパラメーターのセットを格納するために使用されます。スタックを使用しません。
オーバーヘッド再帰には、繰り返される関数呼び出しのオーバーヘッドがあります。繰り返される関数呼び出しのオーバーヘッドはありません。
速度実行が遅い。実行が速い。
コードのサイズ再帰により、コードのサイズが小さくなります。反復によりコードが長くなります。


再帰の定義

C ++では、関数がコード内で自分自身を呼び出すことができます。つまり、関数の定義には、それ自体への関数呼び出しがあります。時には「円形の定義「。関数が使用するローカル変数とパラメーターのセットは、関数がそれ自体を呼び出すたびに新しく作成され、スタックの最上部に格納されます。ただし、関数がそれ自体を呼び出すたびに、その関数の新しいコピーは作成されません。再帰関数は、コードのサイズを大幅に削減することはなく、メモリ使用率を改善することさえしませんが、反復と比較した場合、いくらかは改善します。

再帰を終了するには、関数の定義にselectステートメントを含めて、再帰呼び出しを行わずに関数を強制的に返す必要があります。再帰関数の定義にselectステートメントがないため、一度呼び出された関数は無限再帰になります。

数値の階乗を返す関数で再帰を理解しましょう。

int factorial(int num){int answer; if(num == 1){1を返す; } else {answer = factorial(num-1)* num; //再帰呼び出し} return(answer); }

上記のコードでは、else部分のステートメントが再帰を示しています。ステートメントは、それが存在する関数factorial()を呼び出すためです。

反復の定義

反復は、反復ステートメントの条件が偽になるまで、命令セットを繰り返し実行するプロセスです。反復ステートメントには、初期化、比較、反復ステートメント内のステートメントの実行、最後に制御変数の更新が含まれます。制御変数が更新された後、再び比較され、反復ステートメントの条件が偽になるまでプロセスが繰り返されます。反復ステートメントは、「for」ループ、「while」ループ、「do-while」ループです。

反復ステートメントはスタックを使用して変数を保存しません。したがって、反復ステートメントの実行は、再帰関数と比較して高速です。反復関数でさえ、関数呼び出しを繰り返すオーバーヘッドがなく、再帰関数よりも実行速度が速くなります。制御条件が偽になると、反復は終了します。反復ステートメントに制御条件が存在しないと、無限ループが発生したり、コンパイルエラーが発生したりする可能性があります。


上記の例に関する反復を理解しましょう。

int factorial(int num){int answer = 1; //初期化の前に不要な値が含まれている可能性があるため、初期化が必要ですfor(int t = 1; t> num; t ++)// iteration {answer = answer *(t);リターン(回答); }}

上記のコードでは、関数は反復ステートメントを使用して数値の階乗を返します。

  1. 再帰とは、プログラム内のメソッドがそれ自体を繰り返し呼び出す場合であり、反復とは、プログラム内の一連の命令が繰り返し実行される場合です。
  2. 再帰的なメソッドには、命令のセット、それ自体を呼び出すステートメント、および終了条件が含まれますが、反復ステートメントには、初期化、インクリメント、条件、ループ内の命令のセット、および制御変数が含まれます。
  3. 条件文は再帰の終了を決定し、制御変数の値は反復文の終了を決定します。
  4. メソッドが終了条件に至らない場合、無限再帰に入ります。一方、制御変数が終了値に至らない場合、反復ステートメントは無限に反復します。
  5. 無限の反復はシステムクラッシュを引き起こす可能性がありますが、無限の反復はCPUサイクルを消費します。
  6. 再帰は常にメソッドに適用されますが、反復は命令セットに適用されます。
  7. 再帰中に作成された変数はスタックに保存されますが、反復にはスタックは必要ありません。
  8. 再帰は関数呼び出しのオーバーヘッドを繰り返しますが、反復には関数呼び出しのオーバーヘッドはありません。
  9. 関数呼び出しのオーバーヘッドにより、再帰の実行は遅くなりますが、反復の実行は速くなります。
  10. 再帰はコードのサイズを縮小しますが、反復はコードを長くします。

結論:

再帰関数は簡単に記述できますが、反復に比べてパフォーマンスが低下します。一方、反復は記述が難しくなりますが、再帰に比べてパフォーマンスは良好です。