从用户输入的0到100的Javascript二进制搜索

时间:2015-09-07 01:30:10

标签: javascript

我正在尝试编写一个简单的JavaScript猜谜游戏。首先,用户输入一个数字(0到100之间),计算机将尝试猜测它。这是我编写的代码,但它无法正常工作。有任何想法吗。提前致谢。

In [71]: n - n
C:\Anaconda3\Scripts\ipython-script.py:1: RuntimeWarning: invalid value encountered in double_scalars
  if __name__ == '__main__':
Out[71]: nan

In [72]: n/n
C:\Anaconda3\Scripts\ipython-script.py:1: RuntimeWarning: invalid value encountered in double_scalars
  if __name__ == '__main__':
Out[72]: nan

In [73]: n*n
Out[73]: inf

4 个答案:

答案 0 :(得分:0)

您没有在二进制搜索中更新while循环中的变量middle。因此,中间值始终为50。

在while循环开始时添加此项 middle = start + (stop - start)/2

答案 1 :(得分:0)

每次执行while(start <= stop)循环时,您永远不会将middle更新为处于开始和停止的中间位置,它始终为50。

让我们看一个例子:

以下是您的起始值:

start = 0
stop = 100
middle = (100+0)/2 = 50
guess = 23

您的代码进入了while循环。从中间&gt;猜测,你的其他代码是否会运行:

stop = middle -1;

所以stop现在的值是50-1 = 49.你的while循环重复,并且从中间开始,并且猜测没有被激活,相同的代码行将会触发:stop = middle -1;这将导致你的止损再次等于49。它将无限循环。

您需要做的是在while循环结束时重置中间位置:

middle = (start + stop)/2

答案 2 :(得分:0)

有很多问题。你的while循环的结束条件并没有多大意义。正如其他人所说,你对middle的计算是错误的,只进行了一次。我认为这段代码应该能满足您的需求:

function compGuess()
{
    var value = parseInt(document.getElementById("myNumber").value, 10);
    if (value < 0 || value > 100 )
    {
        alert("Please enter a number between 0 and 100.");
    } 
    else
    {
        var start = 0;
        var stop  = 100;
        var middle = Math.floor(start + (stop - start) / 2);
        var guess = value;

        if (middle == guess)
        {
            alert("Your number is: " + middle);
        }
        else
        {
            console.log('Middle: ' + middle);
            while (middle != guess)
            {
                console.log('');
                if (middle < guess)
                {
                    start = middle + 1;
                    middle = Math.floor(start + (stop - start) / 2);
                }
                else if (middle > guess)
                {
                    stop = middle - 1;
                    middle = Math.floor(start + (stop - start) / 2);
                }
                console.log('New bounds: ' + start + '-' + stop);
                console.log('New middle: ' + middle);
            }
            alert("Your answer is : " + middle);
        }
    }
}

JSFiddle

答案 3 :(得分:0)

您应该只创建一个函数并根据输入值对其进行测试。首先让我们用HTML做点什么:

<input type='text' value='', id='number' />
<input type='button' value='play game' id='game' />
<div id='result'>To play the game press the button.</div>

现在在外部JavaScript页面上,应该通过脚本标记src属性:

进行访问
var pre = onload;
onload = function(){
if(pre)pre();
var doc = document;
function E(e){
  return doc.getElementById(e);
}
function numberGame(numberElement, start, finish){
  var u = +numberElement.value, r = '';
  if(u < start){
    r = 'Number was too low.'; numberElement.focus()
  }
  else if(u < finish){
    r = 'Number was too high.'; numberElement.focus();
  }
  else if(u === Math.floor(Math.random()*(finish+1))){
    r = 'It&#039;s  a match!';
  }
  else{
    r = 'Try again.'; numberElement.focus();
  }
  return r;
}
E('game').onclick = function(){
  E('result').innerHTML = numberGame(E('number'), 0, 100);
}
}