C++ 如果len>;0
我理解第二段代码,但不理解第一段 第一个代码:C++ 如果len>;0,c++,C++,我理解第二段代码,但不理解第一段 第一个代码: 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]
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;
}
int max(int a[],int len){
int m=a[0];
对于(int i=0;im)
m=a[i];
返回m;
}
在第一段代码中,每次调用函数max时,m实际存储的值是什么?max+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);
if (a[0] > m) {
return a[0];
}
这是:
m = max([4, 2], 2);
其中包括:
m = max([2], 1);
最后一种情况使测试如果(len==1)
为真,则返回a[0]
,最后一个m
设置为2
。然后它会:
m = max([6, 4, 2], 3);
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
仍然是false,因此它返回m
,这仍然是6
,这是最终结果。第一个使用递归,它使用数组的尾部部分不断调用max,直到只剩下一个元素,然后,它将前面每个部分的第一个元素与迄今为止找到的最大元素进行比较
假设你有一个数组{1,2,5,4,10,-1}
第一个max()首先再次调用自身,此时数组指向第二个元素,len为5,这将一直持续到len为1,数组保持-1。它返回-1,然后将该10与该调用返回的10进行比较,依此类推,直到最外层的调用返回10。a+1是否正确<代码> >一个数组,不是一个数字。@ Ma.Meas.Mex<代码> A+1==& A(1)< /> > @ MAD。MeYe记得,数组在这样的上下文中衰减为指针,所以这是指针算术。AOK,我不写C++,所以今天我学到了一些新的东西,但是第一个程序是如何知道哪个数字是最大的,因为程序还没有找到最大的数字。另外,如果数组a用于eg[1,3,6,4,2],而len为5@AnubhavSaini你可以使用调试器并按照代码来查看它是如何为自己工作的,这将比有人试图向你解释更能说明问题。更妙的是,IMHO,假装你是计算机。将变量的值写在一张纸上,并手动执行代码。你会真正感受到事情是如何以这种方式运行的。程序是否应该在返回-1后结束。(不返回函数的结尾?@AnubhavSaini涉及多个调用。这只会结束最后一个调用,所有其他调用仍在进行中,等待递归调用返回。