第一、二周的算法课主要讲授了以下内容:
递归:直接或间接地调用自身的算法称为递归算法,亦称函数自身的嵌套调用。
典型的例子:求解斐波那契数列,汉诺塔问题,整数划分问题等。递归较难理解,但实行起来相对而言比较简洁明了,但递归的空间开销往往非常大,即空间复杂度较高,运行时间可能会比较长。
分治法:将一个规模为n的问题分解为K个规模较小的子问题。
典型运用分治策略的例子:二分搜索算法,大整数乘法等。
二分法:对已经有序的一组数据运用分治策略,将问题的规模折半缩小,逐步细化,使得计算更便捷,时间复杂度也得到了有效的降低(O(logN))。
1 #include <iostream> 2 using namespace std; 3 int a[10]={1,6,11,12,15,17,24,26,27,29};//初始的数组 4 5 int BiSearch(int l,int r,int val){ 6 if(l==r) return -1;//找不到 7 int m = (l+r)/2; 8 if(a[m]==val) return m; 9 else if(a[m]>val) BiSearch(l,m,val); 10 else BiSearch(m+1,r,val); 11 } 12 13 int main(){ 14 int e; 15 cin>>e;//输入要查找的数字 16 int ans = BiSearch(0,9,e); 17 cout<<ans<<endl; 18 }
结对编程体会:
我们代码风格比较接近,比较容易看得懂对方的代码。以一个旁观者的姿态去观看他人的代码可以学习一下他人的思路,遇到不懂之处或者对方的纰漏可以及时指出,同时,结对编程也可以让自己更加注重代码风格,尽量避免他人看不懂的情况出现。