我正在尝试找到各种可能性,等于数字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>