如何计算这两个函数的时间复杂度? (递归)

How to calculate time complexity of these two functions? (recursion)

第一个函数:

def f1(n):
if n == 1:
   return 1
return f(f(n-1))

第二个函数:

def f2(n):
if n == 1:
    return 1
return 1 + f(f(n-1))

现在我明白为什么两个函数的 space 复杂度都是 O(n),因为递归深度等于 n
但是关于时间复杂度,我无法像以前使用正常递归方程那样计算它,可以说我们在第一个函数中使用 f(n-1) 而不是 f(f(n-1)) 。那么它将是 T(n) = 1 + T(n-1) = 2 + T(n-2)=... = n 所以 O(n),我可以直观地理解它可能对 f1 保持不变,因为所有 returns 都是 1 所以我可能有 2n 次迭代,即 O(n) 但我不知道如何正式处理它。
对于 f2 我不知道如何达到时间复杂度,直觉在这里让我失望,我非常感谢任何有关如何分析这些递归调用的帮助。

最终答案是:f1: Time Complexity: O(n), Space Complexity: O(n)

f2: Time complexity: O(2^n), Space complexity: O(n).

正如我想您意识到的那样,在 f1 中您正在执行两个操作:

  1. 致电f1(n - 1)
  2. 用第一次操作的结果再次调用 f1

您可以看到用任何东西调用 f1...或至少任何大于零的东西...returns 1.

在第 2 步中,您只是用 1 再次调用 f1,当立即 returns 时。 O(N).

继续 f2。让我们检查一下这个函数的行为。

  • 当n = 1时,我们return 1.
  • 当n=2时,我们return1 + f2(1)。我们知道 f2(1) returns 1,所以 f2(2) returns 2.
  • 当n=3时,我们return1 + f2(2),所以3.
  • 等等

所以看起来 f2(n) 只是 returns n.

每次调用 f2 时,我们都在做与 f1 中相同的事情:用 n - 1 调用 self,然后用任何数字再次调用 self。

换句话说,我们用 n - 1 调用了 f2 两次。对于每个 n,我们将调用次数加倍,因此 O(2^N).