【发布时间】:2018-05-23 22:18:33
【问题描述】:
我无法理解这个分而治之的函数如何比较数据元素:
int main()
{
int arr[] = { -5, -10, -16, -3, -7 };
int largest;
largest = largest_element(arr, 0, sizeof(arr) / sizeof(int));
cout << "Largest element in arr is " << largest << ".\n";
return 0;
}
int largest_element(const int *a, int begin, int past_end)
{
int result;
int mid;
int left_large;
int right_large;
assert(begin >= 0);
assert(begin < past_end);
if (past_end - begin == 1)
result = a[begin];
else {
mid = (begin + past_end) / 2;
left_large = largest_element(a, begin, mid);
right_large = largest_element(a, mid, past_end);
if (left_large >= right_large)
result = left_large;
else
result = right_large;
}
//STOP! draw tree here when begin == 1, and past_end == 2.
return result;
}
我知道数组被简单地分成更小的子数组,一旦达到基本情况,它将返回 a[begin]。但是,根据我的图表,如果我们有一个包含两个元素的数组,它只是返回第一个值,我不明白如何真正比较这些值。例如,如果数组中最右边的元素没有其他可比较的元素,如何比较它?
Here is my diagram.我没有其他图表可与之比较。
【问题讨论】:
-
past_end - begin == 1在只剩下一个元素而不是两个元素时为真。因此,单个元素之间的比较发生在倒数第二级的if(left_large >= right_large)行中。 -
当数组中有两个值时,请使用调试器单步执行此程序,并亲自查看。这就是调试器的用途。
-
第一次比较只发生在
right_large = largest_element(a, 1, 2);之后。但我猜指令说在那之前停止?目前尚不清楚评分者在寻找什么,我们可能必须在您的课堂上才能确切知道这些图表是如何教给您的。 -
如果你有一个包含两个元素的数组(
{5, 7}),它会将它分成两个子问题;一种是返回5,另一种是返回7。函数返回这两个中的最大值。
标签: c++ arrays recursion divide