【问题标题】:Increment and decrement variable until statement is true [closed]递增和递减变量,直到语句为真[关闭]
【发布时间】:2013-07-01 23:50:33
【问题描述】:

所以我有一个变量值范围,没有办法确定确切的数字,只有一个接近它的数字(大约 50 高于或低于未知数)。所以假设正确的数字是 910(再一次,这个数字会大于或小于已经确定的数字)并且我计算 900。我将如何编写一个尝试 900、899、901、898、902 的函数, 897...以此类推,直到等于未知变量?

【问题讨论】:

  • 您可以使用绝对值函数,但它不会按照您指定的顺序进行。
  • 你会如何比较你的猜测和未知数?
  • 最好使用一些二分搜索算法来获得更好的性能
  • @Patashu 在任何一种情况下,如果您尝试搜索一个号码,您仍然需要一个号码来搜索。因此,如果您已经有一个号码,那么尝试搜索的意义何在?
  • @AustinDizzy 所以您实际上是在尝试破坏 Web 服务?你是白帽子还是黑帽子?

标签: javascript


【解决方案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?";
}

【讨论】:

  • 任何普通的循环都行不通,抱歉。刚才OP提到了要搜索的数字只能通过访问服务器来确定,所以它必须是异步ajax代码,回调移动到下一个要测试的值。
  • @SimonMcKenzie 你说得对,看来是我不得不重新思考我的逻辑了; )。
  • @MichaelGeary,是的,但如果 OP 只是在寻找一种算法,这确实回答了这个问题......
  • @SimonMcKenzie - 嗯,异步要求确实大大改变了算法。请参阅我对工作版本的回答 - 它的任何地方都没有循环。 :-)
【解决方案2】:

由于对“未知”号码的测试实际上是一个服务器调用,因此您不能使用简单的循环来执行此操作。相反,您需要异步处理所有内容。

这是一个例子:

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

这需要 50 的猜测和 3 的最大上下增量,并测试从 45 到 55 的幻数。

记录的结果是:

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() 应使用truefalse 调用其callback 函数参数以指示号码是否匹配。 testMagicNumberAjax() 上面有一个示例(未经测试)Ajax 版本。

您可以将上面的代码粘贴到 Chrome 控制台中进行快速测试;更改magic 的值以尝试不同的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多