void printScientificNotation(double value, int powerOfTen)
{
if (value >= 1.0 && value < 10.0)
{
System.out.println(value + " x 10^" + powerOfTen);
}
else if (value < 1.0)
{
printScientificNotation(value * 10, powerOfTen - 1);
}
else // value >= 10.0
{
printScientificNotation(value / 10, powerOfTen + 1);
}
}
假设imputs不会导致无限循环
我理解该方法的用途,但我无法找到表示方法的方法。 例如,如果value为0.00000009或9e-8,则该方法将调用printScientificNotation(value * 10,powerOfTen - 1);八次和System.out.println(值+“x 10 ^”+ powerOfTen);一旦。
因此e的指数递归调用它。但是我如何通过大O表示法表示这一点?
谢谢!
答案 0 :(得分:1)
这是一个棘手的问题吗?该代码将对其某些输入无限递归(例如,value = -1.0,powerOfTen = 0),因此对于任何有限函数f(n),其运行时间不是O(f(n))。
修改:假设value > 0.0
...
运行时间(或递归深度,如果您希望以这种方式查看)不依赖于powerOfTen
的值,仅在value
上。对于范围[1.0,10.0]中的初始输入value
,运行时间是常数,因此O(1),对于[10.0,+ infinity中的value
,除以{{1}每次递归调用直到value
为止,因此运行时为O(log 10 (value < 10.0
))。可以对范围(0.0,1.0)中的value
进行类似的参数,但请注意,对于这种情况,log 10 value
为负。因此,您的最终答案可能涉及绝对值操作。然后,您可以考虑是否有必要在渐近复杂性分析的上下文中指定对数基数。希望你能从那里拿走它!