判断数组 a 中是否包含了数值 x
bool IsContained(int a[], int n, int x)
{
bool ret = false;
if(n > 0)
{
ret = (a[n - 1] == x) || IsContained(a, n - 1, x);
}
return ret;
}
判断数组 a 是否有序
bool IsOrdered(int a[], int n, bool min2max = true)
{
bool ret = true;
if(n > 1)
{
ret = (min2max ? (a[n - 1] >= a[n - 2]) : (a[n - 1] <= a[n - 2])) && IsOrdered(a, n - 1, min2max);
}
return ret;
}
查找数组 a 中的最大值
常规解法如下:
int MaxInArray(int a[], int begin, int end)
{
int ret = -9999;
if(begin == end)
{
ret = a[begin];
}
else
{
int bv = a[begin];
int rv = MaxInArray(a, begin + 1, end);
ret = (bv > rv) ? bv : rv;
}
return ret;
}
int MaxInArray(int a[], int n)
{
return MaxInArray(a, 0, n - 1);
}
这种解法的递归深度更深,它的空间复杂度更高
优化后的解法如下:
int MaxInArray(int a[], int begin, int end)
{
int ret = -9999;
if(begin == end)
{
ret = a[begin];
}
else
{
int mid = (begin >> 1) + (end >> 1) + (begin & end & 1); // 防止 begin + end 溢出,等价于 begin + (end - begin) / 2
int lmax = MaxInArray(a, 0, mid);
int rmax = MaxInArray(a, mid + 1, end);
ret = (lmax > rmax) ? lmax : rmax;
}
return ret;
}
int MaxInArray(int a[], int n)
{
return MaxInArray(a, 0, n - 1);
}
它的递归深度为常规解法的一半,它的空间复杂度更低。