递归
-
递归实际上是通过栈的方式来实现,因此其效率低
-
尾递归(即通过return来返回结果,如阶乘)可以通过循环实现
-
非尾递归可以用模拟栈来实现
-
实例:斐波那契数列的实现
– 递归实现int fobinacci(int n) { if (n <= 1)return n; else { return (f(n - 1) + f(n - 2)); } }
– 循环实现
int fobinacci(int n) { int pre, now, next; if (n <= 1)return n; else { pre = 0; now = 1; for (int i = 2; i <= n; ++i) { next = pre + now; pre = now; now = next; } return next; } }
分治
- 分支和递归一般结合使用,分治可以将大规模问题分解为多个小问题
- 应用分治法的前提
- 问题规模缩小后容易解决
- 问题具有最优子结构性质:问题分解为若干规模较小的相同子问题
- 子问题的解可以合并为原问题的解
满足1,2,不满足3可考虑贪心算法或动态规划 - 子问题相互独立
避免重复解决公共问题,效率低下
复杂度计算
代换法
- 主要思想
猜测解的形式
通过数学归纳法找出使解真正有效的常数 - 例子
迭代法
- 主要思想
模拟该递归关系执行过程,从而计算算法运行时间 - 实现
直接展开法
递归树法
- 实例
(知识点: 3 ( l o g 4 n ) = n l o g 4 3 3^(log4^n)=nlog4 ^3 3(log4n)=nlog43,两边lg即可推)
主方法
- 主要思想
特殊情况套公式