在标题书的第5章中,描述了“分而治之”的方法,用于查找数组中的最大数字,并附上以下图像:
使用的Java代码:
static double max(double a[], int l, int r)
{
if (l == r) return a[l];
int m = (l+r)/2;
double u = max(a, l, m);
double v = max(a, m+1, r);
if (u > v) return u; else return v;
}
我认为图片不正确。例如,使用(0,1)进行方法调用,即T max(0,1)应该返回I而不是T. 我是对的吗?
书中的其他图片也是错误的:
请澄清我对递归的理解可能有问题。
答案 0 :(得分:1)
第一张图片中显示的示例是返回数组中的最高字母,而不是数字。显示的数字表示每个字母的数组索引。因为T>我,max(0,1)
返回T.算法的整体返回值为Y,因为它是所有这些中最高的字母。
在第二张图片中,第一棵树的每个节点似乎是其直接子节点的总和;第二棵树的每个节点看起来都是其直接子节点平均值的最低点;第三棵树基本上显示了你的第一张照片。
我希望这能为你澄清事情!
答案 1 :(得分:0)
首先:代码使用double
,示例似乎使用了char
,因此示例和代码未完全对齐。
第二:在max(l, r)
中,l
和r
会对数组产生影响,而不是实际值。比较值为T
和I
。在我的ASCII表格上,我的字母I
出现在T
之前,因此I
小于T
。所以两者的最大值是T
。
答案 2 :(得分:0)
我认为图片不正确。例如,用(0,1)进行方法调用,即T max(0,1)应该返回I而不是T.我是对的吗?
没有
致电max(a, 0, 1)
分配m = 0
,然后递归调用max(a, 0, 0)
和max(a, 1, 1)
。值u
和v
分别为'T'
和'I'
,其中最大值为'T'
...将返回。