【问题标题】:JavaScript Binary search w/out array无数组的 JavaScript 二进制搜索
【发布时间】:2018-05-04 08:12:54
【问题描述】:

我正在尝试使用 JavaScript 创建一个数字猜谜游戏来进行代码挑战,我对这种语言非常陌生,需要一些帮助。

游戏的前提是让计算机猜测用户的数字在0到100之间是多少。参数是使用if-else语句和while循环中的confirm函数。有人建议使用将通过循环移动的二进制搜索(不使用和数组);通过询问用户他们的数字是高于、低于还是等于计算机当前的猜测来缩小计算机的猜测范围。

如下所示,如果用户确认该语句为真,我可以启动 if 语句并给出结果。但现在我被困在如何继续使用 else if 语句,继续循环,并成功实现二进制搜索。我已经开始了 else if 语句,但我知道这很可能不是要走的路。我试图通过堆栈溢出和其他网站搜索如何使用二进制搜索,但是所有结果都通过我无法做到的数组使用它返回。任何帮助和建议将不胜感激。

var guessNumGame = function () {
	'use strict';
	var low = 0;
	var high = 100;
	var number;

	alert("Think of a number betwwen 0 and 100");
	while (low <= high) {
		number = Math.round((low + high) / 2);

		if (window.confirm("Is your number " + number + " ? Click OK for 
        Yes, CANCEL for No.") == true ) {

			 alert("You got it! Thanks for playing!");

		} //this is where I'm stuck on how to proceed and below is unfinished

        else if (window.confirm("Is your number higher or lower? Click OK 
        for higher, CANCEL for lower. ") < true) {

			 window.confirm("Is your number " + number / 2 + " ? Click OK 
             for Yes, CANCEL for No.") == true;

		}else {

			return guess;
		}

		 return; // this return is here just to avoid and infinite loop
	}

};

window.onload = guessNumGame;
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Pick a Number</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <h1>Pick a number for me to guess</h1>
    <script src="js/pick_number.js"></script>
  </body>
</html>

【问题讨论】:

    标签: javascript binary-search


    【解决方案1】:

    这段代码实现了你的想法,你想要实现的非常有趣!但是实现它的想法似乎并不方便。

    var guessNumGame = function () {
    	'use strict';
    	var low = 0;
    	var high = 100;
    	var number;
    
    	alert("Think of a number betwwen 0 and 100");
    	while (low <= high) {
        	number = Math.floor((Math.random() * (high - low + 1))) + low;
    		if (window.confirm("Is your number " + number + " ? Click OK for Yes, CANCEL for No."))
    			 return alert("YAAAY! I WON");
         	if (window.confirm("Is your number higher or lower? Click OK for higher, CANCEL for lower. ")) {
    			low = number + 1;
    		} else {
    			high = number - 1;
    		}
    	}
    
    };
    
    guessNumGame();

    【讨论】:

      【解决方案2】:

      您可以将 while 循环与您的确认语句结合使用,以一种简单的方式创建它。

      注意事项:

      1. 我已将确认包装在一个辅助函数中以提高代码的可读性。
      2. 在询问它是否较高后,我跳过了检查它是否较低的提示,因为它是多余的。

      样本

      function guessNumber(number) {
        return confirm('Is ' + number + ' your number?');
      }
      
      function askIfHigher(number) {
        return confirm('Is your number greater than ' + number + '?');
      }
      
      function startGame() {
        // Initialise variables
        var low = 0,
          high = 100,
          mid,
          complete = false;
      
        // Repeat while we have not guessed the answer or binary search fails
        while (!complete && (low <= high)) {
          // Guess number
          mid = Math.floor((low + high) / 2);
          complete = guessNumber(mid);
          if(complete){
            // Guess is correct, exit while loop
            break;
          }
          // Guess is incorrect adjust binary search parameters as needed
          if (askIfHigher(mid)) {
            low = mid + 1;
          } else {
            high = mid - 1;
          }
        }
        if(!complete){
          // Binary search terminated without getting a result
          alert('You must have picked a number outisde of 0-100');
        }else{
          alert('Congratulations! your number was: '+mid);
        }
      
      }
      
      startGame();

      【讨论】:

      • 它无法正常工作。如果我想到假设 60,那么下一个猜测应该是 75(根据二进制搜索),但您的代码会猜测 76,并在进一步的猜测中累积此错误。
      • 这是由于Math.round的使用而发生的,我尝试猜测60并相应地回答并得到答案..
      • 您会得到正确的答案。但是“有人建议使用二进制搜索”。您的二分搜索已损坏。
      • 坏了,怎么办?你能分享一个失败的案例吗?
      • 根据我有限的理解,只要始终如一地进行,向上还是向下舍入都没有关系。编辑我的答案以向下取整,因为大多数语言都会像这样进行整数截断。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多