以下问题已在 GATE CS 2013 考试中提出。
1)如果调用前p的值被初始化为5,f(p,p)的返回值是多少?请注意,第一个参数是通过引用传递的,而第二个参数是通过值传递的。
int f(int &x, int c) {
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
(一) 3024
(乙) 6561
(三) 55440
(四) 161051
答案 (B)
由于 c 是按值传递而 x 是按引用传递,因此所有函数都将具有 x 的相同副本,但 c 的副本不同。
f(5, 5) = f(x, 4)*x = f(x, 3)*x*x = f(x, 2)*x*x*x = f(x, 1)*x*x *x*x = 1*x*x*x*x = x^4
由于 x 在每次函数调用中都会递增,因此在调用 f(x, 2) 后它变为 9。所以表达式 x^4 的值变成了 9^4,也就是 6561。
#include
int f(int &x, int c)
{
c = c - 1;
if (c == 0) return 1;
x = x + 1;
return f(x, c) * x;
}
int main()
{
int p = 5;
printf("%d", f(p, p));
}
1) 一棵二叉搜索树的前序遍历序列是30, 20, 10, 15, 25, 23, 39, 35, 42. 以下哪一个是同一棵树的后序遍历序列?
(一) 10, 20, 15, 23, 25, 35, 42, 39, 30
(乙) 15, 10, 25, 23, 20, 42, 35, 39, 30
(C) 15、20、10、23、25、42、35、39、30
(四) 15, 10, 23, 25, 20, 35, 42, 39, 30
答案 (D)
下面是构建的树
30
/ \
20 39
/ \ / \
10 25 35 42
\ /
15 23
3) 考虑以下函数
int unknown(int n) {
int i, j, k = 0;
for (i = n/2; i <= n; i++)
for (j = 2; j <= n; j = j * 2)
k = k + n/2;
return k;
}
上面函数的返回值是多少?
(A) Θ(n^2)
(B) Θ(n^2Logn)
(C) Θ(n^3)
(D) Θ(n^3Logn)
答案 (B)
外循环运行 n/2 或 Θ(n) 次。内部循环运行 Θ(Logn) 次(请注意,j 在每次迭代中除以 2)。所以语句“k = k + n/2;”运行 Θ(nLogn) 次。该语句将 k 的值增加 n/2。所以 k 的值变成 n/2*Θ(nLogn) 也就是 Θ(n^2Logn)
4) 使用堆排序可以在 Θ(logn) 时间内排序的元素数量是
(A) Θ(1)
(B) Θ(sqrt(logn))
(C) Θ(Log n/(Log Log n))
(d) Θ(Log n)
答案 (C)
对于 m 个输入元素,堆排序的时间复杂度为 Θ(mLogm)。对于 m = Θ(Log n/(Log Log n)),Θ(m * Logm) 的值将是 Θ( [Log n/(Log Log n)] * [Log (Log n/(Log Log n)) )] ) 将是 Θ( [Log n/(Log Log n)] * [ Log Log n – Log Log Log n] ) 是 Θ(Log n)
5)要求以下给出的过程来查找和替换某些字符在阵列A供给到被替换阵列oldc供给的字符的输入内,而它们各自的替换字符以阵列NEWC供给。数组 A 的固定长度为 5 个字符,而数组 oldc 和 newc 各包含三个字符。然而,程序有缺陷
void find_and_replace(char *A, char *oldc, char *newc) {
for (int i = 0; i < 5; i++)
for (int j = 0; j < 3; j++)
if (A[i] == oldc[j]) A[i] = newc[j];
}
该程序使用以下四个测试用例进行测试
(1) oldc = “abc”, newc = “dab”
(2) oldc = “cde”, newc = “bcd”
(3) oldc = “bca”, newc = “cda”
(4) oldc = “abc”, newc = “bac”
测试器现在在所有长度为 5 的输入字符串上测试程序,这些字符串由字符’a’、’b’、’c’、’d’ 和 ‘e’ 组成,并且允许重复。如果测试人员用上面给出的四个测试用例进行这个测试,有多少测试用例能够捕捉到缺陷?
(一) 只有一个
(B) 只有两个
(C) 只有三个
(D) 所有四个
答案 (B)
测试用例 3 和 4 是唯一捕获缺陷的用例。当旧字符被新字符替换并且新字符再次被另一个新字符替换时,代码无法正常工作。这不会发生在测试用例 (1) 和 (2) 中,它只发生在用例 (3) 和 (4) 中。
6) 如果让数组 A 保存字符串“abcde”,上述四个测试用例中的哪一个将成功暴露该程序中的缺陷?
(A) 无
(B) 仅 2 个
(C) 仅 3 和 4
(D) 仅 4 个
答案 (C)
#include
#include
void find_and_replace(char *A, char *oldc, char *newc) {
for (int i = 0; i < 5; i++)
for (int j = 0; j < 3; j++)
if (A[i] == oldc[j]) A[i] = newc[j];
}
int main()
{
char *oldc1 = "abc", *newc1 = "dab";
char *oldc2 = "cde", *newc2 = "bcd";
char *oldc3 = "bca", *newc3 = "cda";
char *oldc4 = "abc", *newc4 = "bac";
char test[] = "abcde";
printf("Test 2\n");
printf("%s\n", test);
find_and_replace(test, oldc2, newc2);
printf ("%s\n", test);
printf("\nTest 3\n");
strcpy(test, "abcde");
printf("%s\n", test);
find_and_replace(test, oldc3, newc3);
printf ("%s\n", test);
printf("\nTest 4\n");
strcpy(test, "abcde");
printf("%s\n", test);
find_and_replace(test, oldc4, newc4);
printf ("%s\n", test);
}
输出:
Test 2
abcde
abbcd
Test 3
abcde
addde
Test 4
abcde
aacde
请参阅 GATE Corner 了解所有往年论文/解决方案/解释、教学大纲、重要日期、笔记等。