序列总共打印了多少颗星星 经营:
A a = new A();
for (int i=0; i<N; ++i) a.f(N);
class A
{
int k = 0;
void f(int N)
{
if (k == 0)
{
k = N;
for (int i = 0; i<N; ++i) StdOut.print("*");
}
k = k-1;
StdOut.print("*");
}
}
这个问题的答案不是O(n)吗?我不确定为什么,但这对我来说似乎是正确的 - 当我查看代码时。似乎方法f中的for循环仅在第一次调用 aF(N)时运行,因为if语句 if(k == 0) - 如果第一个for循环是:for(int i = 0; i &lt; = N; ++ i)然后我认为答案是O(n ^ 2)。
答案 0 :(得分:0)
确实,方法的for
循环仅在第一次调用时运行并打印 N 星号。每次通话(也是第一次)也会打印一个星号,因此星号总数 2N ,即 O(n)。
如果顶部循环会一直运行直到 N 包含在内,那么 k 会在最后一次额外调用时为0,因此它就像第一次调用一样:<打印强> N 额外星号,以及为任何通话打印的星号。
这使 3N + 1 星号仍然 O(n)。
var N = 200;
var a = new A();
for (var i=0; i<N; ++i) a.f(N);
console.log('asterisks: ', a.count);
function A() {
var k = 0;
this.count = 0;
this.f = function(N)
{
if (k == 0)
{
k = N;
for (var i = 0; i<N; ++i) this.count++;
}
k = k-1;
this.count++;
};
}
&#13;
输出 400 N = 200 。