2015-02-11 95 views
0
public int foo (int x , int k) { 
    if (x <= k) 
     return 1; 
    else 
     return foo (x/k , k) + 1; 
} 

从我的理解,这应该等于条件的运行时间+较大的if/else语句的运行时间。大哦表示法下面语句的运行时间是多少?

但是,我无法确定语句“return foo(x/k,k)+ 1”的正确运行时间。这会保持不变吗? x和k的增加似乎对运行时间没有影响,因为它们之间的比率对结果很重要。

任何清晰度将不胜感激。谢谢!

+0

从逻辑上推导出结果似乎相当棘手,但您可以通过测量各种输入的运行时间并寻找趋势来找到答案。幸运的是,你甚至不需要时间测量功能来做到这一点,因为函数返回的数字与函数体执行的次数相同。防爆。如果函数返回6,则返回时间是其返回值的两倍3. – Kevin 2015-02-11 14:10:06

回答

2

递归调用每次将x除以k,所以k> = 2的复杂度为O(logk(x))-以k为底的x的对数。

对于k < 2它可能不会终止(实际上,它将耗尽内存或除以零)。

+0

如果k> = 2 ... – 2015-02-11 14:18:11

+0

为真,则修正它。 – svinja 2015-02-11 14:25:32

+0

那么,实际上-2也会终止 – 2015-02-11 14:26:59