0
点赞
收藏
分享

微信扫一扫

递归基础练习

搬砖的小木匠 2022-03-11 阅读 50

判断数组 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);
}

它的递归深度为常规解法的一半,它的空间复杂度更低。

举报

相关推荐

0 条评论