2013-07-04 37 views
0

所以我有一个范围的值,也没有办法确定确切的数字,只有数接近它(约50上方或下方数目不详)的变量。所以我们假设正确的数字是910(再一次,这个数字大于或小于已经确定的数字)并且我计算了900.我将如何编写一个函数来尝试900,899,901,898,902, 897 ...等等等等,直到它等于未知变量?递增和递减变量,直到说法是正确的

+0

您可以使用绝对值函数,但它不会按照您指定的顺序进行。 – jeremy

+3

你会如何比较你的猜测与未知数? –

+2

更好用一些二进制搜索算法,以获得更好performanace –

回答

1
var guess = x; 
var answer = 910; 
var high = guess; 
var low = guess; 

while (high !== answer && low !== answer) { 
    high++; 
    low--; 
} 

if (high === answer) { 
    print high; 
} else if (low === answer) { 
    print low; 
} else { 
    print "how did you get here?"; 
} 
+0

任何一种普通的循环都不行,对不起。 OP刚刚提到要搜索的数字只能通过点击服务器才能确定,因此它必须是异步ajax代码,回调会移至下一个要测试的值。 –

+1

@SimonMcKenzie你是对的,看起来像是我必须重新思考我的逻辑; )。 – Teemu

+0

@MichaelGeary,不错,但是如果OP只是在寻找一个算法,这个的确会回答这个问题...... –

0

由于测试为“未知”号实际上是一个服务器的呼叫,你不能用一个简单的循环做到这一点。相反,你需要异步处理所有事情。这里有一个例子:

// Starting with guess, test that value and nearby integers up through 
// guess+maxDelta and down through guess-maxDelta. 
// Each number is tested by calling testMagicNumber(). This function 
// can make an Ajax call or other asynchronous action, and then it 
// should call the callback passed to it with true or false. 
// When a match is found, call the callback function with that value. 
// If no match is found call the callback function with false. 
function findMagicNumber(guess, maxDelta, callback) { 
    var delta = 0, sign = +1; 
    nextNumber(); 
    function nextNumber() { 
     var value = guess + sign*delta; 
     //console.log('Testing', value); 
     testMagicNumber(value, function(match) { 
      if(match) { 
       callback(value); 
      } 
      else { 
       if(sign > 0) 
        ++delta; 
       sign = -sign; 
       if(delta <= maxDelta) 
        nextNumber(); 
       else 
        callback(false); 
      } 
     }); 
    } 
} 

// Test version of a magic number matcher, using a hard coded value 
function testMagicNumber(value, callback) { 
    callback(value == magic); 
} 

// Untested example of a function to test a magic number 
// with a server request. isMagic(result) is whatever test 
// you need to make on the result to get a boolean value 
// for the callback. 
function testMagicNumberAjax(value, callback) { 
    $.ajax({ 
     url: 'test', 
     data: { value: value }, 
     error: function() { 
      callback(false); 
     }, 
     success: function(result) { 
      callback(isMagic(result)); 
     } 
    }); 
} 

for(var magic = 45; magic <= 55; ++magic) { 
    console.log('Magic number is', magic); 
    findMagicNumber(50, 3, function(result) { 
     console.log('Matched', result); 
    }); 
} 

这通过55结果记录需要的50猜测和最大增量达和3下,并测试幻数从45:

Magic number is 45 
Matched false 
Magic number is 46 
Matched false 
Magic number is 47 
Matched 47 
Magic number is 48 
Matched 48 
Magic number is 49 
Matched 49 
Magic number is 50 
Matched 50 
Magic number is 51 
Matched 51 
Magic number is 52 
Matched 52 
Magic number is 53 
Matched 53 
Magic number is 54 
Matched false 
Magic number is 55 
Matched false 

testMagicNumber()函数是您将Ajax调用命中服务器的地方。当您从呼叫得到响应,testMagicNumber()应该调用其callback功能参数与truefalse来表示,如果数字匹配。在testMagicNumberAjax()中有一个示例(未经测试)的Ajax版本。

您可以将代码粘贴到上方的镀铬控制台做一个快速的测试;更改magic的值以尝试不同的数字。