1
私は大きなO表記を練習していましたが、再帰関数を除いてはわかりました。私は単純なものに対処することができます(O(n)
またはO(1)
のようなものですが、他の何かが失われてしまうもの) 以下は3つの練習問題です。回答者がどのように答えを見つけたか説明していただければ幸いです。ビッグO再帰関数の表記
method2
の
n
電話を持つことになりますので、
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);
}
}
}
各再帰呼び出しで問題がどのように縮小するかを考えてみてください。たとえば、線形に縮小し、1回の呼び出しにつき1回の呼び出ししかない場合は、O(n)になります。各コールが2つの新しいコールを作成し、両方とも線形に縮小すると、O(n^2)になります。 – paddy