分治策略是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。这就自然导致递归过程的产生。
递归是指一个函数能够直接或者间接的调动自己,就称之为递归函数(自己调用自己)。
分治法所能解决的问题一般具有以下特征:
- 该问题缩小的一定程度就可以容易地解决;
- 该问题可以分解为若干个规模较小的相同问题;
- 使用小规模的解可以合并成该问题原规模的解;
- 该问题所分解出的各个子规模是相互独立的。
分治法步骤:
- 分解:将问题划分为一些子问题,子问题的形式与原问题一样只是规模更小。
- 解决:递归地求解子问题,如果子问题的规模足够小,则停止递归,直接求解。
- 合并:将小规模的解组合成原规模问题的解。
比如说求n!这个问题就适合用分治的策略来求解,我们将一个问题的规模缩小,而问题不变,如下图所示:
我们可以用循环来解决阶乘这个问题,其时间和空间复杂度分别为O(n)和S(1):
int fun(int m)
{
int sum = 1;//在这里要注意整型溢出的情况
//解决办法有两种,一种是加判断是否溢出的条件;
//另外一种是将sum的类型定义为long类型
for (int i = 1; i <= m; i++)
{
sum