我正在做一些考试准备,其中一个问题是描述以下C代码的作用。
int g(int *a, int b ,int c){
if(b==c) return a[b];
return g(a,b,(b+c)/2) + g(a,(b+c)/2+1 ,c);}
根据我对左手总和的理解,似乎无法弄清楚递归 是系列b + 2 ^ n / 2 * c的总和,并且系列的总和是(2 ^ n / 2)*(b + c),其中n从0开始。但是n没有值将使系列分别等于b或c。这是否意味着如果第一个if条件不满足,它将继续为无穷大?
答案 0 :(得分:2)
假设b < c
,g()
将数组a[]
的元素总和从索引b
返回到索引c
(包括两者)
换句话说,
g( a, b, c ) :=
int sum = 0;
for( int i = b; i <= c; ++i )
sum += a[ i ];
return sum;
Assume c - b = n
(b + c)/2
= (c - b + 2b)/2
= (c - b)/2 + b
= b + n/2
Thus, g( a, b, (b + c)/2 ) + g( a, (b + c)/2 + 1, c )
= g( a, b, b + n/2 ) + g( a, b + n/2 + 1, c )