我正在尝试找到各种可能性,等于数字1-9等于100。此功能可以产生理想的结果,但也可以产生其他我没有想到的结果。其他结果总计为100,但其中的某些数字却没有,例如省略了3或6。为什么包括这些其他结果?

    var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var signs = ["+", "-", "N"];
    var results = [];
    find100("1");
    function find100(expr) {
       if (eval(expr.replace(/N/g, "")) === 100) {
          results.push(expr);
       } else {
          for (var i = eval(expr.substring(expr.length - 1, expr.length)) + 1; i <=
          nums.length; i++) {
             signs.forEach(function(sign) {
                var expr2 = expr;
                find100(expr2 += sign + i);
             });
          }
       }
    }


所需的输出:

1+2+3-4+5+6+78+9,
1+2+34-5+67-8+9,
1+23-4+5+6+78-9,
1+23-4+56+7+8+9,
12+3+4+5-6-7+89,
12+3-4+5+67+8+9,
12-3-4+5-6+7+89,
123+4-5+67-89,
123+45-67+8-9,
123-4-5-6-7+8-9,
123-45-67+89

最佳答案

它添加了不需要的结果,因为您的第一个循环遍历了剩余的每个数字,并且添加了任何计算结果为100的结果,即使它跳过了某个数字也是如此。如果该方法找到数字的解,则将解决方案添加到results-是正确的,但是,如果找不到解决方案,则将移至下一个数字。这是跳过的数字的来源。如果没有数字的解决方案,则不应继续使用下一个数字。

至于如何解决,这是一个不同的问题(但为什么不...)

此处的区别在于,只有对于任何数字,存在一个使用所有剩余数字的表达式时,您才可以得到结果。



var results = [];
var operations = [ "+", "-", "" ];
var expected = 100;
var limit = 10;

function findExpression(expr, next) {
    if (next === limit) {
        eval(expr) === expected && results.push(expr);
    } else {
        operations.forEach(function(operation) {
            findExpression(expr + operation + next, next + 1);
        });
    }
}

$(document).ready(function() {
    findExpression("1", 2);
    for(var i=0; i<results.length; i++) {
        $("#foo").append(results[i]+"<br />");
    }
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<body>
<div id="foo"></div>
</body>

07-24 09:37
查看更多