该算法假设在我的程序中询问英文字母的中间字母N
。此时它询问用户是否:
猜测是正确的
这封信是字母表中较早的字母。
这封信后面是字母
在尝试猜测Jose
时,它会先询问N
。我选择选项2然后给我G
。然后我选择选项3然后给我Q
。然后我选择选项2然后给我I
。然后我选择选项3然后给我R
。如果我选择选项2,它会再次给我R
,基本上我会卡在R
和I
之间。如何修复算法以正确提供所有可用字母?
我的代码如下:
int let = 26/2;
if(n != 0) {
//Correct guess
if(n == 3) {
aLetter = alphabet[let];
actualLetter = Character.toString(aLetter);
aName.add(actualLetter);
}
//earlier in alphabetical order
else if(n == 2) {
let /= 2;
}
//later in alphabetical order
else if(n == 1) {
for(int i = let; i < 27; i++){
r += 1;
}
r /= 2;
let += r;
r=0;
}
} //done guessing
else if (n == 0) {
for(String str: aName) {
result3 += str;
}
}
任何帮助和建议都会很棒。谢谢!
答案 0 :(得分:1)
假设猜测的字母(由--- etc.
表示)是“s”(由+
表示)。计算机将首先在中间进行猜测(let
= 13,由|
表示)。
-------------|---+--------
你告诉电脑猜得更高。
使用代码
for(int i = let; i < 27; i++) {
r += 1;
}
r /= 2;
let += r;
r=0;
可以缩短为
let += (26 - let) / 2;
计算机将猜到中途(let
= 19):
-------------|---+-|------
到目前为止一切顺利。
现在,你告诉它猜测更低。计算机知道它高于13且低于19,因此它应该在两者之间猜测。但是,您拥有的代码不会这样做。
let /= 2;
使let
成为(int)(19 / 2)
,即9。
---------|---|---+-|------
你想要的是let
= 16
-------------|--|-+|------
让我们说你成功了
-------------|--|-+|------
最近的猜测为16.您告诉计算机猜测更高。使用代码
let += (26 - let) / 2;
let
将成为21。
-------------|--|-+|-|----
你想要的是let
= 18或19;
一般来说,一个好的算法应该使let
每次迭代上升或下降“13/2 n ”,其中“n”是迭代次数(从{{开始) 1}})。
因此,您应该使用代码
0
并将评论替换为您已使用的代码。