我正在尝试理解以下算法的工作原理。
#include <iostream>
using namespace std;
int maxsimum(int a[], int l, int r) {
if (l == r)
return a[l];
int m = (l+r)/2;
int u = maxsimum(a,l,m);
int v = maxsimum(a,m+1,r);
return u>v?u:v;
}
int main() {
int a[] = {34,23,45,56,30,31,57,33,55,10};
int n = sizeof(a)/sizeof(int);
cout << maxsimum(a,0,n) << endl;
return 0;
}
首先,我感兴趣的是尽管算法工作得正确,但我仍然不明白它如何找到最大元素。我将展示我如何理解这个算法:
第一步:我们假设数组的情况下,
l=0
和r=10
,它检查 if (l>r)
,当然不成立,所以计算 m=(0+10)/2;
。然后再为新界限执行该过程。第一对是(0,5),第二对是(6,10),在最终操作之后,它比较了两个返回值,并最终返回它们之间的最大元素。这个算法总是有效吗?在每次迭代中,它不进行任何比较,只有最后一步。它如何确定每个递归迭代的最大元素?它只检查什么。例如:取一对(0,5),(0是否大于5)? 不是,所以再重复一次,将这些边界分成两个部分,得到新的平均值m1=(0+5)/2,然后再返回某个元素,但不是最大值。对于第二个子数组,我们也可以说同样的话。
这个算法的主要思想是什么?