1. 再帰と反復の違い
## 時間計算量の比較
##再帰を見つける時間の計算量は、反復の時間計算量よりも困難です。
再帰- : 再帰の時間計算量は、前の呼び出しに基づいて n 番目の再帰呼び出しの値を見つけることでわかります。したがって、基本ケースに基づいてターゲットケースを見つけ、それを基本ケースに基づいて解くことで、再帰方程式の時間計算量を理解することができます。
反復- : 反復の時間計算量は、ループ内で繰り返されるループの数を見つけることでわかります。
使用方法の比較
これらの手法のいずれを使用するかは、時間の複雑さとコード サイズのトレードオフになります。オフ。
-
時間の計算量が重視され、再帰呼び出しの数が多くなる場合は、反復を使用するのが最善です。
-
ただし、時間の複雑さが問題ではなく、コードの短さが問題になる場合は、再帰が最適な方法になります。
-
再帰: 再帰には同じ関数を再度呼び出すことが含まれるため、コードの長さは非常に短くなります。ただし、分析で確認したように、再帰呼び出しの数が大量になると、再帰の時間計算量が指数関数的に増大する可能性があります。したがって、再帰の使用はコードを短くする場合に有利ですが、時間の複雑さは高くなります。
-
反復: 反復とは、コードのブロックを繰り返すことです。これには大量のコードが必要ですが、時間の複雑さは通常、再帰よりも低くなります。
オーバーヘッド
再帰には、反復と比較して多くのオーバーヘッドがあります。
再帰での無限繰り返し
は CPU クラッシュを引き起こしますが、実行中に反復の際、メモリが使い果たされると停止します。 -
Recursion : Recursion では、指定された基本条件のエラーにより無限の再帰呼び出しが発生する可能性があり、連続呼び出しが false になることはありません。システム CPU がクラッシュする可能性があります。 -
Iteration : イテレータの代入エラー、インクリメント エラー、または終了条件エラーによる無限反復は、無限ループとなり、システムに問題が発生する場合とそうでない場合があります。エラーになりますが、プログラムのそれ以降の実行は確実に停止されます。
再帰#反復
|
| ##定義 | 関数はそれ自体を呼び出します。
繰り返し実行される一連の命令。
#関数に |
を適用します。 |
For ループ。 |
終了 |
基本的なケースでは、ここでは関数呼び出しは行われません。 |
反復子の終了条件が満たされなくなったとき。 |
使用法 |
コード サイズを小さくする必要があり、時間の複雑さが問題にならない場合に使用します。 |
時間の複雑さと拡張されたコード サイズのバランスをとる必要がある場合に使用します |
コード サイズ |
コードの削減 |
コードの増加 |
時間計算量 |
非常に高い (通常は指数関数的な) 時間計算量。 |
時間計算量は比較的低いです (通常は多項式対数)。 |
空間の複雑さ |
空間の複雑さは反復よりも高くなります。 |
空間の複雑さは低いです。 |
ヒープ |
ここでのスタックは、関数が呼び出されたときにローカル変数を格納するために使用されます。 |
スタックは使用しないでください。 |
速度 |
スタックの維持と更新のオーバーヘッドがあるため、実行は遅くなります。 |
一般に、スタックを使用しないため、再帰よりも高速です。 |
ストレージ |
再帰では、反復と比較してより多くのメモリが使用されます。 |
反復中に関数呼び出しがないため、オーバーヘッドはありません。 |
#Elevated | 関数呼び出しを繰り返すオーバーヘッドがあります。 | 反復中に関数呼び出しがないため、オーバーヘッドはありません。 |
無限繰り返し | 再帰関数が終了条件を満たしていないか、未定義であるか、基本ケースに到達しない場合、スタック オーバーフロー エラーが発生し、システムが無限に実行される可能性があります。再帰でクラッシュします。 | 繰り返しステートメントの制御条件が false にならない場合、または制御変数が終端値に到達しない場合、無限ループが発生します。無限ループでは、CPU サイクルが何度も使用されます。 |
2.コード | public class Test {
// ----- 递归 -----
// 求给定数的阶乘的方法
static int factorialUsingRecursion(int n)
{
if (n == 0)
return 1;
// 递归呼叫
return n * factorialUsingRecursion(n - 1);
}
// -----迭代 -----
//求给定数的阶乘的方法
static int factorialUsingIteration(int n)
{
int res = 1, i;
// 迭代
for (i = 2; i <= n; i++)
res *= i;
return res;
}
public static void main(String[] args)
{
int num = 5;
System.out.println("Factorial of " + num
+ " using Recursion is: "
+ factorialUsingRecursion(5));
System.out.println("Factorial of " + num
+ " using Iteration is: "
+ factorialUsingIteration(5));
}
}
ログイン後にコピー
Factorial of 5 using Recursion is: 120
Factorial of 5 using Iteration is: 120
ログイン後にコピー
以上がJava における再帰と反復の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。