我一直在练习大O符号,除了涉及递归函数之外,我似乎理解它。我可以处理简单的问题(比如O(n)
或O(1)
,但我通常会迷失其他任何东西。
以下是三个实践问题,如果有人解释他们如何找到答案的过程,我将非常感激。
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 :(得分:0)
这个例子很简单。
在method2
中,您从n
开始,然后按1
向下走,直至1
。因此,您将n
拨打method2
,即O(n)
。
method3
与method2
相同,只是操作不同。您可以将method3
调整为n
,然后将1
减少method4
。
在n
中,2
减少1
,直至其2
或n/2
,因此您将执行<a name="Suchfeld">Suchfeld</a><a class="Schlagwort" name="Suchfeld_Definition"></a>
步骤,即还是O(n)。
这不是了解递归函数速度的最佳示例。您需要使用具有多个递归选项的示例。
所有这些选项都可以转换为具有相同复杂性的for循环,所以尽量以这种方式思考它是否可以帮助你。