递归
可以使用递归的三个条件:
- 大问题可以拆成子问题
- 子问题的求解方式与大问题一样
- 存在最小子问题
递归的实现运用的是系统栈,运行时进行进栈操作,返回值时进行出栈操作,有栈满的情况。
当每次递归的子问题的规模相同时,递归符合master公式:
T(N) = a*T(N/b)+O(N^d) a,b,d为常数
a:子问题调用的次数
b:子问题的规模(相对于父问题规模N的几倍)
d:除去子问题之外的时间复杂度
master公式:也叫主定理。它提供了一种通过渐近符号表示递推关系式的方法。应用Master定理可以很简便的求解递归方程。
T(N) = a*T(N/b)+O(N^d)
1.当d<log(b,a)时,时间复杂度为O(n^(logb a))
2.当d=log(b,a)时,时间复杂度为O((n^d)*logn)
3.当d>log(b,a)时,时间复杂度为O(n^d)
任何递归行为都可以改为非递归
局部最小
- N-1 < N : N-1为局部最小
- N-1 > N : N为局部最小
- N-2 > N-1,N > N-1 : N-1为局部最小