1.分析以下递归算法并回答问题。(此题6分)
int f(int n)
{
if(n == 0) return 1;
int k = n * f(n / 2);
printf("%d", k);
return k;
}
(1)给出函数调用f(7)的输出结果;
(2)若n>0,试分析函数调用 f(n)的递归最大深度。(用含n的数学式表示)。
答案:
1:1321
解析:
对 n = 7
-
递归调用过程:
- 第 1 次调用:
f(7)
,调用f(3)
- 第 2 次调用:
f(3)
,调用f(1)
- 第 3 次调用:
f(1)
,调用f(0)
- 第 4 次调用:
f(0)
,返回 1 - 总调用次数是 4,递归深度为 4。
- 第 1 次调用:
-
分别计算两种公式:
-
公式 1:加 1 后向上取整
⌈log2(7+1)⌉=⌈log2(8)⌉=⌈3⌉=3 明显不符合,少了一层。 -
公式 2:向上取整后加 1
⌈log2(7)⌉+1=⌈2.807⌉+1=3+1=4 完全符合实际递归深度。
-
2:⌈log2(n)⌉+1
解析:
递归过程分析
递归调用的规则是 f(n)
会调用 f(n / 2)
,直到 n == 0
为止。对于 n = 65
:
- 第 1 次调用:
f(65)
,调用f(32)
- 第 2 次调用:
f(32)
,调用f(16)
- 第 3 次调用:
f(16)
,调用f(8)
- 第 4 次调用:
f(8)
,调用f(4)
- 第 5 次调用:
f(4)
,调用f(2)
- 第 6 次调用:
f(2)
,调用f(1)
- 第 7 次调用:
f(1)
,调用f(0)
- 第 8 次调用:
f(0)
,返回 1。
总递归深度为 8。