以下问题已在 GATE CS 2008 考试中提出。
1. 下面的C程序打印了什么?
int f(int x, int *py, int **ppz)
{
int y, z;
**ppz += 1;
z = **ppz;
*py += 2;
y = *py;
x += 3;
return x + y + z;
}
void main()
{
int c, *b, **a;
c = 4;
b = &c;
a = &b;
printf( "%d", f(c,b,a));
getchar();
}
(一) 18
(二) 19
(三) 21
(四) 22
答案 (B)
/* Explanation for the answer */
/*below line changes value of c to 5. Note that x remains unaffected
by this change as x is a copy of c and address of x is different from c*/
**ppz += 1
/* z is changed to 5*/
z = **ppz;
/* changes c to 7, x is not changed */
*py += 2;
/* y is changed to 7*/
y = *py;
/* x is incremented by 3 */
x += 3;
/* return 7 + 7 + 5*/
return x + y + z;
2. 选择正确的选项来填充?1 和?2,以便下面的程序以相反的顺序打印输入字符串。假定输入字符串由字符终止。
void reverse(void)
{
int c;
if (?1) reverse() ;
?2
}
main()
{
printf ("Enter Text ") ;
printf ("\n") ;
reverse();
printf ("\n") ;
}
(A) ?1 是 (getchar() != ‘\n’)
?2 是 getchar(c);
(B) ?1 是 (c = getchar() ) != ‘\n’)
?2 是 getchar(c);
(C) ?1 是 (c != ‘\n’)
?2 是 putchar(c);
(D) ?1 是 ((c = getchar()) != ‘\n’)
?2 是 putchar(c);
答案(D)
getchar() 用于从用户处获取输入字符, putchar() 用于打印输入的字符,但在打印之前反复调用 reverse 直到输入 ‘\n’ 。当输入 ‘\n’ 时,函数堆栈中的函数一一运行 putchar() 语句。因此,首先打印最后输入的字符。
您可以尝试运行以下程序
void reverse(void); /* function prototype */
void reverse(void)
{
int c;
if (((c = getchar()) != '\n'))
reverse();
putchar(c);
}
main()
{
printf ("Enter Text ") ;
printf ("\n") ;
reverse();
printf ("\n") ;
getchar();
}
对于问题 3 和 4,请考虑以下 C 函数:
int f1(int n)
{
if(n == 0 || n == 1)
return n;
else
return (2*f1(n-1) + 3*f1(n-2));
}
int f2(int n)
{
int i;
int X[N], Y[N], Z[N] ;
X[0] = Y[0] = Z[0] = 0;
X[1] = 1; Y[1] = 2; Z[1] = 3;
for(i = 2; i <= n; i++)
{
X[i] = Y[i-1] + Z[i-2];
Y[i] = 2*X[i];
Z[i] = 3*X[i];
}
return X[n] ;
}
3. f1(n)和f2(n)的运行时间为
(A) Θ(n) 和 Θ(n)
(B) Θ(2^n) 和 Θ(n)
(C) Θ(n) 和 Θ(2^n)
(D) Θ(2^n) 和 Θ(2^n)
答案 (B)
对于 f1() ,让 T(n) 是时间复杂度的函数。
T(n) = T(n-1) + T(n-2)
以上递归是斐波那契数列的标准递归。解决递归后,我们得到
T(n) = 1/sqrt(5)[(1 + sqrt(5))/2]^n - 1/sqrt(5)[(1 - sqrt(5))/2]^n
上面的递归也可以写成 Θ(1.618.^n)
(请看这个)。
在 f2() 中,只有一个循环,因此时间复杂度为 Θ(n)
在所有 4 个给定的选项中,(B)看起来最接近。
4. f1(8) 和 f2(8) 返回值
(A) 1661 和 1640
(二) 59 和 59
(C) 1640 和 1640
(D) 1640 和 1661
两个函数执行相同的操作,所以输出相同,意味着(B)或(C)是正确的。
f1(2) = 2*f1(1) + 3*f1(0) = 2
f1(3) = 2*f1(2) + 3*f1(1) = 2*2 + 3*1 = 7
f1(4) = 2*f1(3) + 3*f1(2) = 2*7 + 3*2 = 20
f1(5) = 2*f1(4) + 3*f1(3) = 2*20 + 3*7 = 40 + 21 = 61
我们可以跳过这个,因为唯一剩下的选择是(C)
f1(6) = 2*f1(5) + 3*f1(4) = 2*61 + 3*20 = 122 + 60 = 182
f1(7) = 2*f1(6) + 3*f1(5) = 2*182 + 3*61 = 364 + 183 = 547
f1(8) = 2*f1(7) + 3*f1(6) = 2*547 + 3*182 = 1094 + 546 = 1640