所以我有一个范围的值,也没有办法确定确切的数字,只有数接近它(约50上方或下方数目不详)的变量。所以我们假设正确的数字是910(再一次,这个数字大于或小于已经确定的数字)并且我计算了900.我将如何编写一个函数来尝试900,899,901,898,902, 897 ...等等等等,直到它等于未知变量?递增和递减变量,直到说法是正确的
回答
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?";
}
任何一种普通的循环都不行,对不起。 OP刚刚提到要搜索的数字只能通过点击服务器才能确定,因此它必须是异步ajax代码,回调会移至下一个要测试的值。 –
@SimonMcKenzie你是对的,看起来像是我必须重新思考我的逻辑; )。 – Teemu
@MichaelGeary,不错,但是如果OP只是在寻找一个算法,这个的确会回答这个问题...... –
由于测试为“未知”号实际上是一个服务器的呼叫,你不能用一个简单的循环做到这一点。相反,你需要异步处理所有事情。这里有一个例子:
// 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
功能参数与true
或false
来表示,如果数字匹配。在testMagicNumberAjax()
中有一个示例(未经测试)的Ajax版本。
您可以将代码粘贴到上方的镀铬控制台做一个快速的测试;更改magic
的值以尝试不同的数字。
- 1. 增量和变量的递减printf中
- 2. 变量正在递增不正确
- 3. 的MySQL变量未递增正确
- 4. React.js递增和递减计数器映射不正确
- 5. 递增和递减混乱
- 6. 递增和递减操作
- 7. 减少循环中递增的变量
- 8. 同时递增和递减共享变量
- 9. 递增/递减button.onclicklistener
- 10. 递增变量
- 11. 递增变量
- 12. 以角度形式递增递减量
- 13. Jquery中的递减值和递增值
- 14. 的Javascript基本递增和递减
- 15. iReport中每个数据集的递增(或递减)变量值
- 16. 重置点击后递减的变量的正确方法是什么?
- 17. 为什么我没有正确递增/递减?
- 18. 算法在递增,递减,递增和递减数组中查找最大值和最小值
- 19. 后递增操作不增加变量,直到评价
- 20. numpy.nextafter递减,而不是递增
- 21. 递增和递减操作符
- 22. 柱和预递增,递减在C++
- 23. 使用PreparedStatement执行递增和递减
- 24. 递增和递减querystring参数?
- 25. 构建一个递增值和递减
- 26. 递增和递减操作confution在JAVA
- 27. 递增和递减1个值 - 按钮
- 28. 递增和递减更改对象值
- 29. VHDL-递增和递减按钮
- 30. 递增和递减运算符
您可以使用绝对值函数,但它不会按照您指定的顺序进行。 – jeremy
你会如何比较你的猜测与未知数? –
更好用一些二进制搜索算法,以获得更好performanace –