鉴于此代码:
k = 1;
p = 0;
while (k < n){
k *= 3;
p++;
}
定义第03行以n表示的次数,其中n为输入。 (提示:在第06行的循环结束时找出p和k如何与n相关。在n中表示p并用它来回答这个问题。)
到目前为止,我所做的是计算出p和k执行与n的这些值相关的次数:
我正在努力弄清楚如何定义n与k / p的迭代次数之间的关系。如果有人可以请解释如何确定这一点,将不胜感激。
答案 0 :(得分:1)
您通过尝试几个不同的示例并查看是否可以发现模式来解决此问题。这是一个合理的方法,但是开始工作有点棘手。相反,您可能希望在循环迭代时查看k所采用的值,并查看是否可以在那里工作。
请注意,k作为循环迭代次数的函数呈指数增长:它采用值1,3,9,27,81,....换句话说,它采用了值
3 0 ,3 1 ,3 2 ,3 3 ,3 4 等。
而且,更一般地说,在循环迭代i中,它取值3 i 。
假设只要k大于或等于n,这个循环就会停止,我们可以通过求解3 i 的最小值来计算出多少循环迭代次数。 ≥n。我们可以这样做:
3 i = n
i = log 3 n
这个数字可能不是一个整数,所以我们通过取上限然后说迭代次数是⌈log 3 n⌉
一般来说,如果你看到一些过程可以通过一个恒定的因子反复增长(总是三倍,或总是加倍,或总是上升10倍等),你应该期待看到某种对数术语出现。这是您看到O(log n)的最常见方式之一。
答案 1 :(得分:0)
首先,你的观察有点不对劲。
对于不同的n值,第6行结束后的k和p值将为: -
n = 1 => k = 1 and p = 0.
n = 3 => k = 3 and p = 1.
n = 9 => k = 9 and p = 2.
n = 10 => k = 27 and p = 3.
n = 27 => k = 27 and p = 3.
n = 30 => k = 81 and p = 4.
现在,在第6行的末尾,
if n == k
then 3^p == n
otherwise,
3^(p-1) < n < 3^p