折半查找、欧几里得算法、幂运算和斐波那契数列

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);
}
posted @ 2022-10-18 08:48  aw11  阅读(17)  评论(0)    收藏  举报