规模问题:分治策略,将一个难以解决的规模大的问题,分解成一些规模较小的相同问题
#include<iostream>
using namespace std;
int fac(unsigned int n)//用递归解决阶乘
{
if(n<=1)
return 1;
else
{
return fac(n-1)*n;
}
}
int fun(unsigned int n)//用循环解决阶乘
{
int sum =1;
for(unsigned int i=1;i<=n;i++)
{
sum=sum*i;
}
return sum;
}
int main()
{
int n, sum;
cin>>n;
//sum=fun(n);
sum=fac(n);
cout<<sum<<endl;
}
#include<iostream>
using namespace std;
int fac(unsigned int n)//递归的斐波那契数列
{
if(n<=2)
{
return 1;
}
else
{
return fac(n-1)+fac(n-2);
}
}
int fun(unsigned int n)//循环 斐波那契数列
{
if(n<=0)
{
return 0;
}
if(n<=2)
{
return 1;
}
int a=1,b=1,c;
for(unsigned int i=3;i<=n;++i)
{
c=a+b;
b=a;
a=c;
}
return c;
}
int main()
{
int n,sum;
cin>>n;
//sum=fun(n);
sum=fac(n);
cout<<sum<<endl;
}
/*template<class _Con>
void PrintArray(const _Con&ibr)//对一切容器用他的迭代器打印
{
//cout<<typeid(_Con).name()<<endl;
typename _Con::const_iterator it = ibr.begin();
for(;it!=ibr.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
}*/
/*void PrintArray(const vector<int> &ibr)//只能打印 vector 其他容器不能打印只是打印值 打印出数组的值
{
vector<int >::const_iterator it=ibr.begin();
for(;it!=ibr.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
}*/
template <class _II>
void PrintArray(_II _F,_II _L)//不但可以对容器也可以对数组打印
{
for(;_F != _L;++_F)
{
cout<<*_F<<" ";
}
cout<<endl;
}
#include<iostream>
#include<vector>
using namespace std;
template <class _II>
void PrintArray(_II _F,_II _L)//不但可以对容器也可以对数组打印
{
for(;_F != _L;++_F)
{
cout<<*_F<<" ";
}
cout<<endl;
}
int FindValue(int br[],int n,int val)//数组退化成指针 二分查找
{
int left=0,right=n-1;
int pos=-1;
while(left<=right)//说明区域中还有一个值,还要进行比较 是<=
{
//int mid = (left+right)/2;//可能会导致数据溢出
int mid=(right-left+1)/2+left;//不会导致数据溢出
if(val<br[mid])
{
right=mid-1;
}
else if(val>br[mid])
{
left=mid+1;
}
else
{
while(mid>left&&val==br[mid-1])//找第一个符合要求的数据
--mid;
pos=mid;
break;
}
}
return pos;
}
int main()
{
int ar[]={12,23,34,45,56,67,78,89,90,100};
int n=sizeof(ar)/sizeof(ar[0]);
vector<int > iar(ar,ar+n);
PrintArray(iar.begin(),iar.end());
int pos = FindValue(ar,n,23);
cout<<pos<<endl;
return 0;
}
int FindValue(int br[],int n,int val)//数组退化成指针 二分查找 非递归
{
int left=0,right=n-1;
int pos=-1;
while(left<=right)//说明区域中还有一个值,还要进行比较 是<=
{
//int mid = (left+right)/2;//可能会导致数据溢出
int mid=(right-left+1)/2+left;//不会导致数据溢出
if(val<br[mid])
{
right=mid-1;
}
else if(val>br[mid])
{
left=mid+1;
}
else
{
while(mid>left&&val==br[mid-1])//找第一个符合要求的数据
--mid;
pos=mid;
break;
}
}
return pos;
}
int SearchValue(int br[],int left,int right,int val)//二分查找递归形式
{
int pos=-1;
int mid=(right-left+1)/2+left;
if(val<br[mid])
{
SearchValue(br,left,mid-1,val);
}
else if(val>br[mid])
{
SearchValue(br,mid+1,right,val);
}
else
{
while(mid>left&&br[mid-1]==val)
{
--mid;
pos=mid;
}
return pos;
}
}
int FindValue(int br[],int n,int val)
{
if(NULL==br||n<1)
{
return -1;
}
return SearchValue(br,0,n-1,val);
}