ホームページ >Java >&#&チュートリアル >Java における再帰と反復の違いは何ですか?

Java における再帰と反復の違いは何ですか?

王林
王林転載
2023-05-02 19:25:051008ブラウズ

1. 再帰と反復の違い

  • エンティティ がそれ自身を と呼ぶとき、プログラムは recursive と呼ばれます。

  • ループ (または繰り返し) がある場合、プログラムは 反復呼び出し と呼ばれます。

  • #例: 数値の階乗を求めるプログラム

## 時間計算量の比較

    ##再帰を見つける時間の計算量は、反復の時間計算量よりも困難です。
  • 再帰
  • : 再帰の時間計算量は、前の呼び出しに基づいて n 番目の再帰呼び出しの値を見つけることでわかります。したがって、基本ケースに基づいてターゲットケースを見つけ、それを基本ケースに基づいて解くことで、再帰方程式の時間計算量を理解することができます。

  • 反復
  • : 反復の時間計算量は、ループ内で繰り返されるループの数を見つけることでわかります。

  • 使用方法の比較

これらの手法のいずれを使用するかは、時間の複雑さとコード サイズのトレードオフになります。オフ。
  • 時間の計算量が重視され、再帰呼び出しの数が多くなる場合は、反復を使用するのが最善です。
  • ただし、時間の複雑さが問題ではなく、コードの短さが問題になる場合は、再帰が最適な方法になります。
  • 再帰: 再帰には同じ関数を再度呼び出すことが含まれるため、コードの長さは非常に短くなります。ただし、分析で確認したように、再帰呼び出しの数が大量になると、再帰の時間計算量が指数関数的に増大する可能性があります。したがって、再帰の使用はコードを短くする場合に有利ですが、時間の複雑さは高くなります。
  • 反復: 反復とは、コードのブロックを繰り返すことです。これには大量のコードが必要ですが、時間の複雑さは通常、再帰よりも低くなります。
  • オーバーヘッド

再帰には、反復と比較して多くのオーバーヘッドがあります。
  • 再帰
  • : 再帰には、繰り返しの関数呼び出しのオーバーヘッドがあります。つまり、

    同じ関数への繰り返しの呼び出しが原因です。コードの時間計算量は何倍にも増加しました。

    反復
  • : 反復にはそのようなオーバーヘッドは発生しません。
  • 無限繰り返し

再帰での無限繰り返し
    は CPU クラッシュを引き起こしますが、実行中に反復の際、メモリが使い果たされると停止します。
  • Recursion
  • : Recursion では、指定された基本条件のエラーにより無限の再帰呼び出しが発生する可能性があり、連続呼び出しが false になることはありません。システム CPU がクラッシュする可能性があります。
  • Iteration
  • : イテレータの代入エラー、インクリメント エラー、または終了条件エラーによる無限反復は、無限ループとなり、システムに問題が発生する場合とそうでない場合があります。エラーになりますが、プログラムのそれ以降の実行は確実に停止されます。
再帰#反復##定義関数はそれ自体を呼び出します。 繰り返し実行される一連の命令。 #Elevated関数呼び出しを繰り返すオーバーヘッドがあります。 反復中に関数呼び出しがないため、オーバーヘッドはありません。 無限繰り返し再帰関数が終了条件を満たしていないか、未定義であるか、基本ケースに到達しない場合、スタック オーバーフロー エラーが発生し、システムが無限に実行される可能性があります。再帰でクラッシュします。 繰り返しステートメントの制御条件が false にならない場合、または制御変数が終端値に到達しない場合、無限ループが発生します。無限ループでは、CPU サイクルが何度も使用されます。
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

#関数に を適用します。 For ループ。
終了 基本的なケースでは、ここでは関数呼び出しは行われません。 反復子の終了条件が満たされなくなったとき。
使用法 コード サイズを小さくする必要があり、時間の複雑さが問題にならない場合に使用します。 時間の複雑さと拡張されたコード サイズのバランスをとる必要がある場合に使用します
コード サイズ コードの削減 コードの増加
時間計算量 非常に高い (通常は指数関数的な) 時間計算量。 時間計算量は比較的低いです (通常は多項式対数)。
空間の複雑さ 空間の複雑さは反復よりも高くなります。 空間の複雑さは低いです。
ヒープ ここでのスタックは、関数が呼び出されたときにローカル変数を格納するために使用されます。 スタックは使用しないでください。
速度 スタックの維持と更新のオーバーヘッドがあるため、実行は遅くなります。 一般に、スタックを使用しないため、再帰よりも高速です。
ストレージ 再帰では、反復と比較してより多くのメモリが使用されます。 反復中に関数呼び出しがないため、オーバーヘッドはありません。
2.コード

以上がJava における再帰と反復の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。