折半查找、欧几里得算法、幂运算和斐波那契数列
1.折半查找
template<typename Comparable>
int binarySearch(const vector<Comparable>& a, const Comparable& x)
{
int left = 0, right = a.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] > x) {
right = mid - 1;
}
else if (a[mid] < x) {
left = mid + 1;
}
else return mid;
}
return -1;
}
2. 欧几里得算法,计算两个整数最大公因数
long long gcd(long long a, long long b)
{
while (b != 0) {
long long tmp = a % b;
a = b;
b = tmp;
}
return a;
}
//递归版
long long gcd2(long long a, long long b) {
return b == 0 ? a : gcd(b, a % b);
}
3.幂运算
计算XN的明显的算法是使用N-1次乘法自乘。N≤1是递归的基准情形。否则,若N是偶数,则有XN=XN/2 · XN/2;如果N是奇数,则XN =X(N-1)/2 · X(N-1)/2 · X。
long long pow(long long x, int n) {
if (n == 0)return 1; //基准情形
if (n == 1)return x; //基准情形
if (n % 2)
return pow(x * x, n / 2) * x;
else
return pow(x * x, n / 2);
}
4.斐波那契数列
斐波那契数列的定义时 a0=0, a1=1 以及 an=an-1 + an-2 (n>1)。
//递归
int fib(int n){
if(n<=1) return n;
return fib(n-1)+fib(n-2);
}
//通过记忆化搜索优化后的函数
int memo[MAX_N+1];
int fib(int n){
if(n<=1) return n;
if(memo[n]!=0) return memo[n];
return memo[n]=fib(n-1)+fib(n-2);
}

浙公网安备 33010602011771号