Time 递归函数的大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符号,我似乎理解它,除了递归函数。我可以处理一些简单的事情(比如当它是
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)。