如何使用递归在一个数组中找到Max并将其分成两半?

时间:2018-04-11 16:53:56

标签: c++ arrays recursion

我的教授希望我们使用递归来查找数组中的最大值,特别是通过分割和征服。我的意思是他希望我们将阵列分成两半,沿着下半部分然后通过上半部分。

但是,我遇到了代码的几个问题。首先,我很困惑,因为我不确定如何让阵列停止通过下半部分?我正在添加条件检查,以查看它是否经历了无限循环,但它有点忽略它。此外,当它不应该首先出现时,它似乎已经超出阵列。然后,使用他给出的示例代码,使用标志它似乎跳过10位数组,所有奇数。

我的代码就在这里

#include <iostream>

using namespace std;


int maxarray(const int anarray[], int first, int last)
{
    cout << "call" << endl;
    cin.get();
    int mid = first + (last - first) / 2;
    int firstHalf,lastHalf = 0;
    do{
        cout << firstHalf << " - " << mid << endl;
        cin.get();
    firstHalf = maxarray(anarray, first, mid - 1);
    }
    while(mid!= first);

    do{
    lastHalf = maxarray(anarray, mid+1, last);
    }
    while(mid != last);
    if(firstHalf <= lastHalf)
        return lastHalf;
    else if(lastHalf <= firstHalf)
            return firstHalf;
    else
        return -1;


    }

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};


    for(int x=0;x<10;x++){
        cout << arr[x] << endl;}

    cout << maxarray(arr,0, 10);
}

使用我得到的输出

1
2
3
4
5
6
7
8
9
0
call

0 - 5

call

16777216 - 2

call

16777216 - 0

在最后一个条目之后进入无限循环。我不确定我做错了什么,谷歌搜索得到了简单的答案,但不是他希望我这样做的方式。我的教科书只给了我一些无效的伪代码。从概念上讲,我理解我应该如何工作,但我在应用它时遇到了麻烦。我会向他发一个问题,但他只是转发给StackOverflow和其他网站寻求帮助。 enter image description here

1 个答案:

答案 0 :(得分:4)

你严重过度思考这个问题。通过分而治之策略递归地找到最大值的过程非常简单:

  • 如果因为范围只有一个项目而无法分割,则返回项目
  • 否则将范围分成两部分,在两部分上调用最大值,然后返回两部分中的较大部分

以下是代码中的外观:

int maxarray(const int a[], int first, int last) {
    // Single-item range
    if (first+1 == last) {
        return a[first];
    }
    // Divide-and-conquer
    int mid = first + (last - first) / 2;
    int leftMax = maxarray(a, first, mid);
    int rightMax = maxarray(a, mid, last);
    return leftMax > rightMax ? leftMax : rightMax;
}

Demo.

请注意,尽管我们划分了范围,但算法仍然是线性的,因为我们在所有情况下都解决了两个子问题。另一种说法是,无论顺序如何,我们都必须查看范围内的每一项。