Time 递归函数的大O表示法
我一直在练习大O符号,我似乎理解它,除了递归函数。我可以处理一些简单的事情(比如当它是Time 递归函数的大O表示法,time,big-o,complexity-theory,notation,Time,Big O,Complexity Theory,Notation,我一直在练习大O符号,我似乎理解它,除了递归函数。我可以处理一些简单的事情(比如当它是O(n)或O(1)的时候),但其他的事情我通常都会迷路。 下面是三个实践问题,如果有人解释他们如何找到答案的过程,我将不胜感激 public static int method2(int n) { if (n < 1) throw new IllegalArgumentException(); if (n == 1) return 2; else r
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);
}
}
}
公共静态int方法2(int n)
{
如果(n<1)抛出新的IllegalArgumentException();
如果(n==1)
返回2;
其他的
返回方法2(n-1)*(2*n);
}
公共静态无效方法3(int n)
{
如果(n<1)抛出新的IllegalArgumentException();
如果(n==1)
系统输出打印(“1”);
否则{
方法3(n-1);
系统输出打印(“,”+n);
}
}
公共静态无效方法4(int n)
{
如果(n<1)抛出新的IllegalArgumentException();
如果(n==1)系统输出打印(1);
如果(n==2)系统输出打印(“1”);
否则{
系统输出打印((n+1)/2+);
方法4(n-2);
系统输出打印(“+(n+1)/2);
}
}
}
这个例子非常简单
在method2
中,您从n
开始,然后向下按1
直到1
。因此,您将调用n
调用method2
,即O(n)
method3
与method2
相同,只是操作不同。通过将n
减少1
来调用method3
,直到其为1
在method4
中,您将n
减少2
,直到其1
或2
,因此您将执行n/2
步骤,这仍然是O(n)
这不是理解递归函数速度的最佳示例。您需要使用具有多个递归选项的示例
所有这些选项都可以转换为具有相同复杂性的for循环,因此如果可以帮助您,请尝试以这种方式思考。此示例非常简单 在
method2
中,您从n
开始,然后向下按1
直到1
。因此,您将调用n
调用method2
,即O(n)
method3
与method2
相同,只是操作不同。通过将n
减少1
来调用method3
,直到其为1
在method4
中,您将n
减少2
,直到其1
或2
,因此您将执行n/2
步骤,这仍然是O(n)
这不是理解递归函数速度的最佳示例。您需要使用具有多个递归选项的示例
所有这些选项都可以转换为具有相同复杂性的for循环,因此,如果它能帮助您,请尝试以这种方式思考。只要想想问题如何随着每个递归调用而缩小。例如,如果它线性缩小,并且每个递归只有一个调用,那么它将是O(n)。如果每个调用创建两个新调用,并且它们都线性收缩,则为O(n^2)。只需考虑问题如何随着每个递归调用而收缩。例如,如果它线性收缩,并且每个递归只有一个调用,则为O(n)。如果每个调用创建两个新调用,并且它们都线性收缩,则为O(n^2)。