宏导致的时间复杂度暴增

#define MAX(a, b) ((a > b) ? (a):(b))
static int cycle = 0;
int a[] = { 9, 3, 5, 2, 1, 0, 8, 7, 6, 4 };

int MAX2(int a, int b)
{
  return a > b ? a : b;
}

int max(int n)
{
    ++cycle;
    return !n ? a[0] : MAX(a[n], max(n - 1));
//  return !n ? a[0] : MAX2(a[n], max(n - 1));
}

int main()
{
    max(4);
    return 0;
}
  • 使用函数定义
max(4) n = 4:
	return max2(a[4], max(3));
max(3) n = 3:
	return max2(a[3], max(2));
max(2) n = 2:
	return max2(a[2], max(1));
max(1) n = 1:
	return max2(a[1], max(0));
max(0):
	return a[0];

函数调用会先调用max(3),不断向下调用,直到max(0),然后向上返回,依次求出max(1),max(2)......max总共执行5次

  • 使用宏定义
max(4): n = 4
  ((a[4] > max(3)) ? (a[4]):(max(3)));
max(3): n = 3
  ((a[3] > max(2)) ? (a[3]):(max(2)));
max(2): n = 2
  ((a[2] > max(2)) ? (a[2]):(max(1)));
max(1): n = 1
  ((a[1] > max(0)) ? (a[1]):(max(0)));
max(0): n = 0
  return a[0];

宏定义,前半段判断语句先求一次max,后半段赋值再求一次max,总共执行2 * 2 * 2 * 2 * 2 = 32次

posted @ 2022-07-05 15:43  INnoVation-V2  阅读(45)  评论(0)    收藏  举报