2016-11-30 7 views
1

私は大きなO表記を練習していましたが、再帰関数を除いてはわかりました。私は単純なものに対処することができます(O(n)またはO(1)のようなものですが、他の何かが失われてしまうもの) 以下は3つの練習問題です。回答者がどのように答えを見つけたか説明していただければ幸いです。ビッグO再帰関数の表記

あなたが method2n電話を持つことになりますので、
public static int method2(int n) 
    { 
    if (n < 1) throw new IllegalArgumentException(); 
    if (n == 1) 
     return 2; 
    else 
     return method2(n - 1) * (2 * n); 
    } 


    public static void method3(int n) 
    { 
    if (n < 1) throw new IllegalArgumentException(); 
    if (n == 1) 
     System.out.print("1"); 
    else { 
     method3(n - 1); 
     System.out.print(", " + n); 
    } 
    } 


    public static void method4(int n) 
    { 
    if (n < 1) throw new IllegalArgumentException(); 
    if (n==1) System.out.print(1); 
    else if (n==2) System.out.print("1 1"); 
    else { 
     System.out.print((n+1)/2+ " "); 
     method4(n-2); 
     System.out.print(" "+(n+1)/2); 
    } 
} 
} 
+0

各再帰呼び出しで問題がどのように縮小するかを考えてみてください。たとえば、線形に縮小し、1回の呼び出しにつき1回の呼び出ししかない場合は、O(n)になります。各コールが2つの新しいコールを作成し、両方とも線形に縮小すると、O(n^2)になります。 – paddy

答えて

0

この例では。あなたがnで始まり、それが1に来るまで1で下る、method2

。非常に簡単であり、それがO(n)です。

method3method2と同じですが、操作がまったく異なります。 n1に減らすことによって、その1までmethod3に電話をします。 で

あなたはその1または2まで、2によってnを減らすので、あなたはまだO(n)がn/2の手順を、行います。

これは、再帰関数の速度を理解するための最良の例ではありません。あなたは再帰のための複数のオプションを持つサンプルで遊ぶ必要があります。

これらすべてのオプションは、同じ複雑さを持つforループに変換することができます。そのようにすれば、それがあなたを助けることができる場合は、そのように考えてみてください。