一.递归和循环的区别
void loop()
{
for(int i=0;i<N;i++)
printf("%d\n",i);
}
void recursion(int n)
{
if(n){
recursion(n-1);
printf("%d\n",n);
}
}
void Test1()
{
start=clock();
loop();
end=clock();
printf("ticke1=%f\n",(double)(end-start));
printf("time = %f\n",(double)((end-start)/CLK_TCK));
start=clock();
recursion(N);
end=clock();
printf("ticke1=%f\n",(double)(end-start));
printf("time = %f\n",(double)(end-start)/CLK_TCK);
printf("clk-tck=%f\n",CLK_TCK);
}

看起来差不多,但是递归存在压栈的过程,会存在栈溢出问题
二.多项式计算
double f1(int a[],int n,double x)
{
double result=0;
for(int i=0;i<n;i++)
result=result+a[i]*pow(x,i);
return result;
}
double f2(int a[],int n,double x)
{
double result=0;
for(int i=n;i>0;i--)
result=a[i-1]+x*result;
return result;
}

第二个算法较优,第一个算法复杂度太高。聪明地利用算法,提高效率
三.最大字段和
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和
算法一: O(n3)
//暴力法 三重循环
int count1()
{
int maxCount=0;
int temp=0;
for(int i=0;i<len;i++)
for(int j=i;j<len;j++){
for(int k=i;k<=j;k++){
temp+=s[k];
if(temp>maxCount)
{
maxCount=temp;
head=i;
tail=k;
}
}
temp=0;
}
return maxCount;
}
算法二:O(n2)
//暴力法,二重循环
int count2()
{
int maxCount=0;
int temp=0;
for(int i=0;i<len;i++){
for(int j=i;j>0;j--){
temp+=s[j];
if(temp>maxCount)
{
maxCount=temp;
head=j;
tail=i;
}
}
temp=0;
}
return maxCount;
}
算法三:O(n*logn)
//分治法,nlogn复杂度
int count3(int left,int right)
{
if(left==right)
if(s[left]>0)
return s[left];
else
return 0;
int mid =(left+right)/2;
int maxLeft=count3(left,mid);
int maxRight=count3(mid+1,right);
int templ=0,tempr=0;
int maxl=0,maxr=0;
for(int i=mid;i>=left;i--)
{
templ+=s[i];
if(templ>maxl){
maxl=templ;
}
}
for(int i=mid+1;i<=right;i++)
{
tempr+=s[i];
if(tempr>maxr){
maxr=tempr;
}
}
int border=maxl+maxr;
if(maxl>maxr)
if(maxl>border){
return maxl;
}
else{
return border;
}
else
if(maxr>border){
return maxr;
}
else{
return border;
}
}
算法四:O(n)
//在线处理
int count4(int num)
{
int ThisSum=0,MaxSum=0;
for(int i=0;i<num;i++)
{
ThisSum+=s[i];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
else if(ThisSum<0)
ThisSum=0;
}
return MaxSum;
}

被折叠的 条评论
为什么被折叠?



