【问题标题】:How to find recursive relation of this recursive function?如何找到这个递归函数的递归关系?
【发布时间】:2021-02-04 12:03:53
【问题描述】:

在这里我得到了一个这样的函数,我想找到它的递归关系,然后计算该递归关系的时间复杂度

 public static void f(int n) {
    if (n == 1) {
        //" Do sth "
    } else {
        for (int i = 1; i < n; i++) {
            f(i - 1);
            //" Do sth "
        }
    }
}

实际上我为此尝试了很多,我得到了 T(n) = n * f(n-1) 作为这个函数的关系,但我不是肯定的。你能帮我找到正确的关系并解决它吗?

【问题讨论】:

  • 请注意,时间复杂度将是 n 的表达式,而不是涉及 f() 的表达式:所以开始写出低 n 的运行:给定 f() 运行多少次n=1, n=2, ..., 直到 n=10?实际上写出调用链来了解这段代码的行为是只有你才能做的事情,之后你甚至不太可能仍然需要我们 =)
  • 别忘了添加" Do sth "的贡献。

标签: java recursion time-complexity analytics


【解决方案1】:

假设 T(1) = "Do sth" 是恒定的工作,即它不依赖于输入大小n,您可以将递归时间函数编写为:

T(n) =  T(1) + T(2) + ... + T(n-1)
     =  { T(1) } +  { T(1) } + { T(1) + T(2) } + { T(1) + T(2) + T(3) } + { T(1) + T(2) + T(3) + T(4) } +....

     [let T(1) = x]

     =  x + x + {x + x} + {x + x + (x + x)} + {x + x + (x + x) + x + x + (x + x)} +....

     = x + x + 2x + 4x + 8x + ...

     ~ x.2^(n-2)

     ~ O(2^n)

这是一个python程序来演示求和的系数序列:

t = [0 for i in range(10)]
for i in range(1,10):
  if i == 1:
    t[i] = 1
  else:
    val = 0
    for j in range(1,i):
      val += t[j]
    t[i] = val
print(t[1:])

打印:[1, 1, 2, 4, 8, 16, 32, 64, 128]

您可以看到 2(n-2) for n >= 2 在每个 'n' 上都适用,复杂度为 O(2n)

【讨论】:

  • 再次检查,实际运行时间是 O(phi^n),其中 phi 是黄金分割率 1.618...。
  • @templatetypedef 我发现复杂度改为 2^n。请检查答案,如果不是,请更正。
猜你喜欢
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2014-04-29
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多