如果 len>0

How do both these pieces of code have the same output, provided len>0

本文关键字:gt len 如果      更新时间:2023-10-16

我理解第二个代码,但不了解第一个代码。

第一个代码:

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+1a[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。