1.分治策略的思想
分治就是把规模大的问题,划分为彼此独立的,规模小的结构相似子问题。直到划分到子问题能直接求解时,就通过递归来实现求解所有子问题,并合并所有解。因此递归和分治可以说是孪生兄弟。
2.分治步骤
第(1)步:分 把一个规模大的问题,划分成若干结构相同,能独立求解的子问题。
第(2)步:治通过递归,求出每个子问题的解。
第(3)步:合并把所有子问题的解,合并成一个更大规模问题的解。
这里举个例子:假设我们要数一堆珠子,假设珠子特别多一个数不完了。这时候数珠子就是一个规模很大的问题。第一步:于是我们把珠子分成很多份,让很多去去数一份。这时候就发现数珠子是一个独立结构相似的问题。第二步:每个人都数出自己那一份珠子个数。第三步:把每个人数出个数相加就是总共珠子数。这里相当于合并了解。
3.二分查找
#include<iostream>
using namespace std;
int searchvalue(int left,int right,int *arr,int x)
{
if(right < 1 || arr == NULL)return -1; //判断一下外界传的参数是否正确
int pos = -1;
if(left <= right)
{
int mid = (right-left+1)/2+left;
if(x < arr[mid]) return pos = searchvalue(left,mid-1,arr,x);
else if(x >arr[mid]) return pos = searchvalue(mid+1,right,arr,x);
else
{
while(mid > left && arr[mid-1] == x) //这里防止同一个出现多个x,让pos保存最左边的x下标
{
--mid;
}
pos = mid;
}
}
return pos;
}
int main()
{
int arr[] = {12,13,15,17,43,54,67,76,86,90,92};
int n = sizeof(arr)/sizeof(arr[0]);
int x = 15;
int pos = searchvalue(0,n-1,arr,x);
printf("%d\n",pos);
return 0;
}
斐波那契数列
#include<iostream> using namespace std; //非递归 int fun(int n) { int a = 1, b = 1, c = 1; int i = 2; for(i=2; i<n; i++) { c = a+b; a = b; b =c; } return c; } //朴素递归 int fun1(int n) { if(n <= 2) { return 1; } return fun(n-2)+fun(n-1); } //改良后的递归,时间复杂度比朴素小很多 int fun2(int n,int a,int b) { if(n < 3) return a; else return fun2(n-1,a+b,a); } int fac(int n) { int a = 1; int b = 1; return fun2(n,a,b); }