我的教授希望我们使用递归来查找数组中的最大值,特别是通过分割和征服。我的意思是他希望我们将阵列分成两半,沿着下半部分然后通过上半部分。
但是,我遇到了代码的几个问题。首先,我很困惑,因为我不确定如何让阵列停止通过下半部分?我正在添加条件检查,以查看它是否经历了无限循环,但它有点忽略它。此外,当它不应该首先出现时,它似乎已经超出阵列。然后,使用他给出的示例代码,使用标志它似乎跳过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和其他网站寻求帮助。
答案 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;
}
请注意,尽管我们划分了范围,但算法仍然是线性的,因为我们在所有情况下都解决了两个子问题。另一种说法是,无论顺序如何,我们都必须查看范围内的每一项。