foo()
是O(2^n)
(假设interpeter没有缓存优化)。
bar()
是O(infinity)
(从不终止),并且O(n)
使用惰性求值
说明:
每个foo(n)
调用 2 次调用,f(n-1)
因此您将获得复杂度函数:
T(n) = T(n-1) + T(n-1) = T(n-2) + T(n-2) + T(n-2) + T(n-2) = ... = 2^(n-5)*T(5)
(这...
部分可以用数学归纳法形式化证明)
处于无限循环中,bar(n)
因为假设b>0
- 它将被递归调用b+1
- 这也将满足约束b>0
。通过归纳,您可以得到对于所有b>0
的额外调用bar()
with b'>b
- 这会导致无数次调用bar()
- 因此O(infinity)
使用惰性求值,第二种方法 ( bar()
) 变为O(n)
.
这是因为无限递归仅发生在评估a
- 但是,因为a
从未真正使用过 - 不需要评估参数的表达式a
,并且因为b
减少了每个递归调用 - 你得到O(n)
的正式证明T(n) = T(n-1) + T(n-1)
在O(2^n)
:
基数: T(5) = CONST
假设:T(k) <= CONST * 2^k
对于每个k<n
证明:
T(n) = T(n-1) + T(n-1) <= (assumption) <= CONST* 2^(n-1) + CONST* 2^(n-1) =
= CONST*2*2^(n-1) = CONST * 2^n
从数学归纳法我们可以得出结论,假设是正确的,并且T(n)
在O(2^n)