给定正整数输入,输出通过从1开始的二进制搜索找到输入所需的步数。
我们正在模拟对作为输入的整数的二进制搜索,其中模拟的搜索者可以反复猜测一个整数,并告知该整数是太高,太低还是正确。查找整数的策略如下:
令n为我们要查找的输入整数。
从1的猜测开始。(对于每个猜测,请增加步数(无论是否正确),如果猜测正确,则立即停止并输出总步数。)
反复将猜测加倍,直到猜测大于n(目标数字)。(或者,如果它是正确的,但是上面已经提到的我们的正确猜测规则已经涵盖了这一点。)
现在,设置大于n的2的幂的上限(即,刚猜到的数字),并在其正下方设置2的幂的下限。
反复猜测上限和下限的平均值(四舍五入)。如果它太高,则将其设置为上限。如果它太低,则将其设置为下限。此过程可确保最终导致正确的猜测。
这是一个示例,输入n = 21:
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 24 -> 20 -> 22 -> 21
\__________________________/
repeated doubling \________________________/
repeated averaging
由于这是code-golf,因此以字节为单位的最短代码将获胜。
以下是从n = 1到n = 100的所有输出:
1
2
4
3
6
5
6
4
8
7
8
6
8
7
8
5
10
9
10
8
10
9
10
7
10
9
10
8
10
9
10
6
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
8
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
7
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
10
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
9
14
13
14
12
这是一些更大的测试用例:
1234 -> 21
1337 -> 22
3808 -> 19
12345 -> 28
32768 -> 16
32769 -> 32
50000 -> 28