时隔几年,再写传统的简单问题算法,又有何不同?

 

 

问题一:变量交换

int swap(int &a,int &b){
     a ^= b;
     b ^= a;
     a ^= b;
} 

 

 利用异或操作来进行变量交换,可以省下一个空间,即不借用第三变量。

 

问题二:数组求和

//1.一般算法,迭代形式 
int sum1(int A[],int n){
    
    int sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=A[n];
    }
    return sum;
    
} 

//2.减而治之,递归形式
int sum2(int A[],int n){
    
    return (n<0) ? 0 : sum2(A,n-1) + A[n-1];
    
} 

//3.分而治之,递归形式
int sum3(int A[],int lo,int hi){
    
    if(lo==hi) return A[lo];
    int mi= (lo+hi)>>2;
    return sum3(A,lo,mi)+sum3(A,mi+1,hi);
    
}

  

  问题求解过程更加注重 “套路” ,注重问题本身的描述(归纳)。

          mi= (lo+hi)>>2 

为脱离“递归基”o(1)的时间刻度而造成实际效率下降的困扰,游标取中的操作中 使用“移位运算”而不采用“除法”,衡量了计算机底层对两者的执行效率。


问题三:数组反转

//1.减而治之,递归形式 
int reverse1(int *A,int lo,int hi){

    if(lo<hi)
    {
        swap(A[lo],A[hi]);reverse1(A,lo+1,hi-1); 
    }
//2.迭代形式
int
reverse1(int *A,int lo,int hi){ while(lo<hi) swap(A[lo++],A[hi--]) ; }

  

  似乎,熟悉多钟形式之间的转化。

 

开始,我们为了成长,试着脱离“解决问题”的苦难开始理解“抽象”,离开迭代,学习递归。

后来,我们为了成熟,试着摆脱“依赖问题”的蜜糖开始追求“效率”,离开递归,再学迭代。

  

  加油,我们在成长!

 

posted @ 2019-06-04 16:45  蜡笔小黑  阅读(209)  评论(0编辑  收藏  举报