时隔几年,再写传统的简单问题算法,又有何不同?
问题一:变量交换
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--]) ; }
似乎,熟悉多钟形式之间的转化。
开始,我们为了成长,试着脱离“解决问题”的苦难开始理解“抽象”,离开迭代,学习递归。
后来,我们为了成熟,试着摆脱“依赖问题”的蜜糖开始追求“效率”,离开递归,再学迭代。
加油,我们在成长!