这个问题在这里已有答案:
考虑以下方法:
public int foo(int n) { int x = 1; int k = 0; while (x <= n) { x = x * 2; k = k + 1; } return k; }
foo(13) 返回什么值?我知道答案是4但有人可以告诉我为什么它是4?
foo(13)
以下是步骤/算法步骤:
X=1 k=0 n =13 Step 1: x=2 k=1 Step 2: x=4 k=2 Step 3: x=8 k = 3. Since 8<13... Step 4: x=16 k= 4. 16>13, so return k=4.
它的发现n <2 ^ k,其中k是你的答案 . 当n = 13时:13 <2 ^ k = 2 ^ 4 = 16 .
x 每步加倍,直到它变得大于 13 . 所以 x = 1 -> 2 -> 4 -> 8 -> 16 . 所以它增加了4倍, k 也增加了 4 次 . 所以从 0 变成 4 .
x
13
x = 1 -> 2 -> 4 -> 8 -> 16
k
4
0
K是输入while循环的次数 .
由于x是2次幂,2 ^ 3小于13,所以最后一次进入,2 ^ 4大于13,然后k为4
很简单......
public int foo([13]) { int x = 1; int k = 0; while (x <= n) { x = x * 2; k = k + 1; } return k; }
当x大于或等于n时,你的while循环停止[13]
每次x乘以2
(定义)x = 1
x = 2
x = 4
x = 8
x = 16(现在超过n [13])
所以while循环运行4次
while (x <= n) { x = x * 2; k = k + 1;//dis thang }
k [0] 1 = 1
k [1] 1 = 2
k [2] 1 = 3
k [3] 1 = 4
这就是为什么它的4 .
x 通过循环每次迭代加倍, k 每次增加1 .
用 table 绘制就足够了 .
x | k 1 | 0 2 | 1 4 | 2 8 | 3 16 | 4 32 | <end of loop>
6 回答
以下是步骤/算法步骤:
它的发现n <2 ^ k,其中k是你的答案 . 当n = 13时:13 <2 ^ k = 2 ^ 4 = 16 .
x
每步加倍,直到它变得大于13
. 所以x = 1 -> 2 -> 4 -> 8 -> 16
. 所以它增加了4倍,k
也增加了4
次 . 所以从0
变成4
.K是输入while循环的次数 .
由于x是2次幂,2 ^ 3小于13,所以最后一次进入,2 ^ 4大于13,然后k为4
很简单......
当x大于或等于n时,你的while循环停止[13]
每次x乘以2
(定义)x = 1
x = 2
x = 4
x = 8
x = 16(现在超过n [13])
所以while循环运行4次
k [0] 1 = 1
k [1] 1 = 2
k [2] 1 = 3
k [3] 1 = 4
这就是为什么它的4 .
x
通过循环每次迭代加倍,k
每次增加1 .用 table 绘制就足够了 .