我只是在学习数据结构和算法复杂性的基础知识,但我对如何分析递归算法感到困惑。以此为例:
def expo_recurs(base, exponent):
if exponent == 0:
return 1
elif exponent % 2 != 0:
return base * expo_recurs(base, exponent - 1)
else:
return (expo_recurs(base, exponent / 2))**2
所以最多每个级别调用一次递归函数,这样可以消除指数式增长。每次通过你要么采取奇数情况,要么执行单个乘法步骤或除法步骤的偶数情况,然后将其提升到二次幂。
有人会介意如何分析这一点,以及一般的递归算法吗?
答案 0 :(得分:4)
最坏的情况:因为n是奇数
F(N)= K + F(N-1);
但是下一次它将转到else分支,因为如果n是奇数,则n-1是偶数
那么问题会像这样破裂
F(N-1)= K + F(N-1/2);
通过数学归纳法
f(n)= k * log(n)或复杂度O(log(n))
最好的情况:n甚至是 问题打破半个子问题 F(N)= K + F(N / 2);
通过数学归纳法
f(n)= k * log(n)复杂度O(log(n))
因此,在最佳和最差情况下复杂度为O(log(n))