分析递归函数(甚至评估它们)是一项不平凡的任务。(在我看来)一个很好的介绍可以在 Don Knuths具体数学中找到。
但是,现在让我们分析这些示例:
我们定义了一个函数,它为我们提供了函数所需的时间。假设t(n)
表示 所需的时间pow(x,n)
,即 的函数n
。
然后我们可以得出结论,t(0)=c
因为如果我们调用pow(x,0)
,我们必须检查是否 ( n==0
),然后返回 1,这可以在常数时间内完成(因此常数c
)。
现在我们考虑另一种情况:n>0
. 在这里我们得到t(n) = d + t(n-1)
. 那是因为我们必须再次检查n==1
、计算pow(x, n-1
,因此 ( t(n-1)
),并将结果乘以x
。校验和乘法可以在常数时间内完成(常数d
),pow
需要递归计算t(n-1)
。
现在我们可以“扩展”这个词t(n)
:
t(n) =
d + t(n-1) =
d + (d + t(n-2)) =
d + d + t(n-2) =
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c
那么,我们需要多长时间才能到达t(1)
? 由于我们从 开始t(n)
并在每一步中减去 1,因此需要n-1
几步才能达到t(n-(n-1)) = t(1)
。另一方面,这意味着我们得到n-1
常数 的倍数d
,并且t(1)
被评估为c
。
所以我们得到:
t(n) =
...
d + d + d + ... + c =
(n-1) * d + c
所以我们得到t(n)=(n-1) * d + c
了 O(n) 的元素。
pow2
可以使用Masters theorem来完成。因为我们可以假设算法的时间函数是单调递增的。所以现在我们有了t(n)
计算 所需的时间pow2(x,n)
:
t(0) = c (since constant time needed for computation of pow(x,0))
因为n>0
我们得到
/ t((n-1)/2) + d if n is odd (d is constant cost)
t(n) = <
\ t(n/2) + d if n is even (d is constant cost)
以上可以“简化”为:
t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)
所以我们得到t(n) <= t(n/2) + d
,这可以使用 masters theorem 来解决t(n) = O(log n)
(参见维基百科链接中流行算法的应用部分,例如“二进制搜索”)。