猜测名字的字母的算法不会显示某些字母并且卡在(I和R)之间。如何改进我的算法?

时间:2014-01-15 22:00:52

标签: java algorithm

该算法假设在我的程序中询问英文字母的中间字母N。此时它询问用户是否:

  1. 猜测是正确的

  2. 这封信是字母表中较早的字母。

  3. 这封信后面是字母

  4. 在尝试猜测Jose时,它会先询问N。我选择选项2然后给我G。然后我选择选项3然后给我Q。然后我选择选项2然后给我I。然后我选择选项3然后给我R。如果我选择选项2,它会再次给我R,基本上我会卡在RI之间。如何修复算法以正确提供所有可用字母?

    我的代码如下:

    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;
        }
    }
    

    任何帮助和建议都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

问题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

-------------|--|-+|------

问题2

让我们说你成功了

-------------|--|-+|------

最近的猜测为16.您告诉计算机猜测更高。使用代码

let += (26 - let) / 2;

let将成为21。

-------------|--|-+|-|----

你想要的是let = 18或19;

解决方案

一般来说,一个好的算法应该使let每次迭代上升或下降“13/2 n ”,其中“n”是迭代次数(从{{开始) 1}})。

因此,您应该使用代码

0

并将评论替换为您已使用的代码。