如果 len>0
How do both these pieces of code have the same output, provided len>0
我理解第二个代码,但不了解第一个代码。
第一个代码:
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;
}
在第一个代码中,每次函数最大值时实际存储什么值m,称为
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)
True,因此它返回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
将是错误的,因此它返回m
,它仍然是6
。
在下一个呼叫者中,a[0] == 1
,因此a[0] > m
仍然是错误的,因此它返回m
,它仍然是6
,这是最终结果。
第一个使用递归,它一直在数组的尾随部分中呼叫最大,直到下降到一个元素,然后将每个上述部分的第一个元素与最大元素进行比较到目前为止发现。
想象您的数组{1,2,5,4,10,-1};
第一个max()首先调用自身,现在的数组指向第二个元素,而Len为5,直到LEN为1,而数组保持-1为止。它返回-1,然后比较10个呼叫的10返回10,依此类推,直到最外层调用返回10。
相关文章:
- EASTL矢量<向量<int>>连续的
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 调用 'make_pair(char [len], int&) 没有匹配函数
- "[ptr, ptr+len) must be a valid range"是什么意思?
- 为什么字符串(常量字符* s,size_t pos,size_t len = npos)有效?
- 非常基本的MurmurHash问题:len的变量描述,C++实现的关键
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 这是什么意思 *ptr = len
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 如果 len>0
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- OpenCV 错误:断言失败(a_size.width == len)