一台主流配置的PC上调用f(35)所需时间

循环递归调用时间


网传的一道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 2345÷109=85.8993459 s,所以结果是几分钟。实际跑出来的结果是88.903000。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值