我理解第二段代码,但不是第一段代码。
第一个代码:
int max(int a[], int len)
{
if (len == 1)
return a[0];
int m = max(a+1, len-1);
if (a[0] > m)
return a[0];
return m;
}
第二段代码:
int max(int a[], int len) {
int m = a[0];
for (int i = 0; i < len; ++i)
if (a[i] > m)
m = a[i];
return m;
}
在第一段代码中,每次调用函数max时实际存储的值是什么值
答案 0 :(得分:1)
a+1
是a[1]
的地址,因此递归调用返回从第二个元素开始的子数组的最大值,并将其分配给m
。如果第一个元素大于该元素,则它是数组的最大元素,否则最大元素为m
。
假设您的数组是[1, 3, 6, 4, 2]
和len = 5
。第一次调用max()
时,它会:
m = max([3, 6, 4, 2], 4);
然后这样做:
m = max([6, 4, 2], 3);
这样做:
m = max([4, 2], 2);
确实:
m = max([2], 1);
最后一种情况使测试if (len == 1)
成立,因此返回a[0]
,最后m
设置为2
。然后呢:
if (a[0] > m) {
return a[0];
}
在这种情况下,a[0] == 4
,因此此条件成功,并将4
返回到下一个m
。在该调用方a[0] == 6
中,条件再次成功,因此它将6
返回到其m
。
在下一个来电者a[0] == 3
中,a[0] > m
将为false,因此返回m
,仍为6
。
在下一个来电者a[0] == 1
中,所以a[0] > m
仍然是假的,因此它会返回m
,这仍然是6
,而且还是 dbConn.all("SELECT " + parameters + " FROM " + tableName + "", function(err, rows) {
return rows // could replace with JSON.stringify(rows) If you want to pass JSON data
});
最后的结果。
答案 1 :(得分:0)
第一个使用递归,它一直用数组的尾部调用max,直到它只有一个元素为止,然后将每个前面部分的第一个元素与到目前为止找到的最大元素进行比较。
想象一下你有数组{1,2,5,4,10,-1};
第一个max()通过再次调用自身开始,数组现在指向第二个元素,len为5,这一直持续到len为1并且数组保持-1。它返回-1然后将该10与1进行比较,该调用返回10,依此类推,直到最外层的调用返回10。