网传的一道2015阿里面试题:一台主流配置的PC上,调用f(35)所需时间,有两个版本:
++型
int f(int x)
{
int s = 0;
while (x++ > 0)
{
s += f(x);
}
return MAX(s, 1);
}
结果应该是stack overflow,只会执行几毫秒。
- -型
int f(int x)
{
int s = 0;
while (x-- > 0)
{
s += f(x);
}
return MAX(s, 1);
}
函数调用过程为
f
(
35
)
=
f
(
34
)
+
f
(
33
)
+
.
.
.
.
+
f
(
2
)
+
f
(
1
)
+
f
(
0
)
=
2
∗
(
f
(
33
)
+
f
(
32
)
+
.
.
.
+
f
(
2
)
+
f
(
1
)
+
f
(
0
)
)
…
=
2
34
f
(
0
)
\begin{aligned} f(35) &= f(34)+f(33)+....+f(2)+f(1) +f(0) \\ &= 2*(f(33)+f(32)+...+f(2)+f(1)+f(0))\\ &\dots \\ &=2^{34} f(0) \end{aligned}
f(35)=f(34)+f(33)+....+f(2)+f(1)+f(0)=2∗(f(33)+f(32)+...+f(2)+f(1)+f(0))…=234f(0)
CPU主频为GHz量级,不妨取 C P I f ( 0 ) = 5 CPI_{f(0)}=5 CPIf(0)=5,总时间为 2 34 ∗ 5 ÷ 1 0 9 = 85.8993459 s 2^{34}*5 \div 10^9=85.8993459\ s 234∗5÷109=85.8993459 s,所以结果是几分钟。实际跑出来的结果是88.903000。