Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个递归函数跳过数字?_Javascript_Recursion - Fatal编程技术网

Javascript 为什么这个递归函数跳过数字?

Javascript 为什么这个递归函数跳过数字?,javascript,recursion,Javascript,Recursion,我试图找到各种各样的可能性,用数字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) {

我试图找到各种各样的可能性,用数字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);
             });
          }
       }
    }

它添加了不需要的结果,因为您的第一个循环迭代了剩余的每个数字,并添加了计算结果为100的任何结果,即使它跳过了一个数字。如果该方法找到某个数字的解,它会将该解添加到
结果
——这是正确的,但是如果它没有找到解,它会移动到下一个数字。这是跳过的数字的来源。如果一个数字没有解决方案,它就不应该继续到下一个数字

至于如何修复,这是一个不同的问题(但为什么不…)

这里的区别在于,对于任何数字,只有存在使用所有剩余数字的表达式时,才能得到结果

var结果=[];
变量运算=[“+”,“-”,“]”;
预期风险值=100;
var限值=10;
函数findExpression(expr,next){
如果(下一个===限制){
eval(expr)==预期和结果。推送(expr);
}否则{
操作。forEach(函数(操作){
findExpression(expr+operation+next,next+1);
});
}
}
$(文档).ready(函数(){
findExpression(“1”,2);

对于(var i=0;i,跳过某些数字的原因在此循环中:

for (var i = eval(expr.substring(expr.length - 1, expr.length)) + 1; i <=    
      nums.length; i++) {

eval()?为什么要使用eval?这几乎总是一个糟糕设计的标志。你能包括输出是什么以及你期望或不期望的值吗?因为我正在构建一个带+、-,或无(N)的字符串,以后将进行计算每个数字应该只出现一次?请记住,在javascript运行时使用eval将使jsvm进入一种无法进行大量优化的模式,这通常被认为是不好的做法。但为什么它会跳过一个数字来执行此操作呢?因为您的for循环。您的代码从1开始,然后通过ever进行迭代剩余y数。如果它为2找到了一个解决方案,则将其相加-这很好,但如果它没有为2找到解决方案,则将其移到3。这就是问题的根源。如果没有为2找到解决方案,则应该停止。@Gragh,因为它是一个for循环?很抱歉,听起来有些陈词滥调,但如果你不让for循环中断,它将停止它将继续到下一个数字。它应该已经停止,因为如果它无法通过将当前数字附加到现有的部分表达式中来找到解决方案,则后续的表达式都将不可用valid@Gragh我怀疑你真的应该做findExpression(“,1)因为您的结果集缺少以下内容:
-1+2-3+4+5+6+78+9
。唯一的问题是您会得到重复,因为
+1+2+3-4+5+6+78+9
1+2+3-4+5+6+78+9
在技术上是不同的,应该从一个积极的开始。出于某种原因,我也无法让您的解决方案起作用。
for (var i = eval(expr.substring(expr.length - 1, expr.length)) + 1; i <=    
      nums.length; i++) {