【问题标题】:JavaScript: Why is my While-Loop Infinitely Looping? [closed]JavaScript:为什么我的 While-Loop 无限循环? [关闭]
【发布时间】:2018-04-30 14:37:46
【问题描述】:

我有一个 while 循环,它是针对某个数组路径的算法,我在 javaScript 中创建了它。这是代码。

var Row1 = [0, 0, 0, 0, 0];
var Row2 = [0, 0, 0, 0, 0];
var Row3 = [0, 0, 0, 0, 0];
var Row4 = [0, 0, 0, 0, 0];
var Row5 = [0, 0, 0, 0, 0];
var AllRows = [];

//Add Rows
AllRows.push(Row1, Row2, Row3, Row4, Row5);
console.log(AllRows);

//First Value
var SV1 = [0, (AllRows.length - 1)];
var SV2 = [0, (AllRows.length - 1)];

var GetSV1 = Math.floor(Math.random()*(SV1.length - 1));
var GetSV2 = Math.floor(Math.random()*(SV2.length - 1));
AllRows[GetSV1][GetSV2] = 1;

var Steps = 1;
var PD = "false";
var RV1 = null;
var RV2 = null;
while(PD == "false"){
    RV1 = Math.floor(Math.random()*(AllRows.length - 1));
    RV2 = Math.floor(Math.random()*(AllRows.length - 1));
    if(AllRows[RV1][RV2] == AllRows[GetSV1][GetSV2] || AllRows[RV1][RV2] == "X"){
        continue;
    } else {
        AllRows[RV1][RV2] = 1;
    }

    if(AllRows[0][0] == 1){
        if(Steps >= 1 && AllRows[0][1] == 1){
            AllRows[1][0] = "X";
            Steps++;
            continue;
        } else if(Steps >= 1 && AllRows[1][0] == 1){
            AllRows[0][1] = "X";
            Steps++;
            continue;
        } else{
            AllRows[0][1] = 0;
            AllRows[1][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        } 
        if(Steps >= 2 && AllRows[0][2] == 1){
            AllRows[1][1] = "X";
            Steps++;
            continue;
        } else if(Steps >= 2 && AllRows[1][1] == 1){
            AllRows[0][2] = "X";
            AllRows[2][0] = "X";
            Steps++;
            continue;
        } else if(Steps >= 2 && AllRows[2][0] == 1){
            AllRows[1][1] = "X";
            Steps++;
            continue;
        } else{
            AllRows[0][2] = 0;
            AllRows[1][1] = 0;
            AllRows[2][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 3 && AllRows[0][3] == 1){
            AllRows[1][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[1][2] == 1){
            AllRows[0][3] = "X";
            AllRows[2][1] = "X";
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[2][1] == 1){
            AllRows[3][0] = "X";
            AllRows[1][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[3][0] == 1){
            AllRows[2][1] = "X";
            Steps++;
            continue;
        }  else{
            AllRows[0][3] = 0;
            AllRows[1][2] = 0;
            AllRows[2][1] = 0;
            AllRows[3][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 4 && AllRows[0][4] == 1){
            AllRows[1][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[1][3] == 1){
            AllRows[0][4] = "X";
            AllRows[2][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[2][2] == 1){
            AllRows[3][1] = "X";
            AllRows[1][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[3][1] == 1){
            AllRows[2][2] = "X";
            AllRows[4][0] = "X";
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[4][0] == 1){
            AllRows[3][1] = "X";
            PD = null;
        } else{
            AllRows[0][4] = 0;
            AllRows[1][3] = 0;
            AllRows[2][2] = 0;
            AllRows[3][1] = 0;
            AllRows[4][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 5 && AllRows[1][4] == 1){
            AllRows[2][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 5 && AllRows[2][3] == 1){
            AllRows[1][4] = "X";
            AllRows[3][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 5 && AllRows[3][2] == 1){
            AllRows[4][1] = "X";
            AllRows[2][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 5 && AllRows[4][1] == 1){
            AllRows[3][2] = "X";
            PD = null;
        } else{
            AllRows[1][4] = 0;
            AllRows[2][3] = 0;
            AllRows[3][2] = 0;
            AllRows[4][1] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 6 && AllRows[2][4] == 1){
            AllRows[3][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 6 && AllRows[3][3] == 1){
            AllRows[2][4] = "X";
            AllRows[4][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 6 && AllRows[4][2] == 1){
            AllRows[3][3] = "X";
            PD = null;
        } else{
            AllRows[2][4] = 0;
            AllRows[3][3] = 0;
            AllRows[4][2] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 7 && AllRows[3][4] == 1){
            AllRows[4][3] = "X";
            Steps++;
            continue;
        } else if(Steps >= 7 && AllRows[4][3] == 1){
            AllRows[3][4] = "X";
            PD = null;
        } else if(Steps >= 7 && AllRows[4][4] == 1){
            PD = null;
        } else{
            AllRows[3][4] = 0;
            AllRows[4][3] = 0;
            AllRows[4][4] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
    }else{
        break;
    }
}

}

由于我无法解决问题,我无法找出导致此无限循环的原因,但我知道它可能与 RV1 和 RV2 的声明有关。谁能告诉我代码在哪里让它永远循环?

更新我添加了我的完整代码以帮助我们进一步了解问题。

【问题讨论】:

  • 使你的代码永远循环的部分是while(true)。您应该使用调试器单步执行此代码 - 您将能够跟随并确切了解为什么此循环永远不会到达您的返回值。
  • 一个更好的问题是不应该让它永远循环。我看到两种情况,你 return 而不是 continue。是什么让你认为它应该触及这些界限?你能做些什么来保证它会?
  • 您可以使用returncontinue 省略else,因为它结束了条件而无需进入其余的代码/循环。
  • while(true) 这可能与它有关。
  • @Chase 我取出了while(true),但它仍然无限循环。

标签: javascript while-loop


【解决方案1】:

几点。一,“假”不等于假也不等于真,因为字符串是字符串值,真/假是布尔值。虽然,你可以写这样的代码:

console.log(new Boolean("false") == true); // true
console.log("false" == String(true));      // false

查看更多信息here

不要有字符串和数字的混合数组。因此,我使用 99 而不是“X”,但您可以使用您认为合适的任何数值。您需要指定一个条件以使循环停止。现在循环不再是无穷无尽的。另见here

var Row1 = [0, 0, 0, 0, 0];
var Row2 = [0, 0, 0, 0, 0];
var Row3 = [0, 0, 0, 0, 0];
var Row4 = [0, 0, 0, 0, 0];
var Row5 = [0, 0, 0, 0, 0];
var AllRows = [];

//Add Rows
AllRows.push(Row1, Row2, Row3, Row4, Row5);
console.log(AllRows);

//First Value
var SV1 = [0, (AllRows.length - 1)];
var SV2 = [0, (AllRows.length - 1)];

var GetSV1 = Math.floor(Math.random()*(SV1.length - 1));
var GetSV2 = Math.floor(Math.random()*(SV2.length - 1));
AllRows[GetSV1][GetSV2] = 1;

var Steps = 1;
var PD = true; // "false" to true
var RV1 = null;
var RV2 = null;

while(PD === true){
    RV1 = Math.floor(Math.random()*(AllRows.length - 1));
    RV2 = Math.floor(Math.random()*(AllRows.length - 1));
    if(AllRows[RV1][RV2] == AllRows[GetSV1][GetSV2] || AllRows[RV1][RV2] == 99){
        continue;
    } else {
        AllRows[RV1][RV2] = 1;
    }

    if(AllRows[0][0] == 0){
        if(Steps >= 1 && AllRows[0][1] == 1){
            AllRows[1][0] = 99;
            Steps++;
            continue;
        } else if(Steps >= 1 && AllRows[1][0] == 1){
            AllRows[0][1] = 99;
            Steps++;
            continue;
        } else{
            AllRows[0][1] = 0;
            AllRows[1][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        } 
        if(Steps >= 2 && AllRows[0][2] == 1){
            AllRows[1][1] = 99;
            Steps++;
            continue;
        } else if(Steps >= 2 && AllRows[1][1] == 1){
            AllRows[0][2] = 99;
            AllRows[2][0] = 99;
            Steps++;
            continue;
        } else if(Steps >= 2 && AllRows[2][0] == 1){
            AllRows[1][1] = 99;
            Steps++;
            continue;
        } else{
            AllRows[0][2] = 0;
            AllRows[1][1] = 0;
            AllRows[2][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 3 && AllRows[0][3] == 1){
            AllRows[1][2] = 99;
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[1][2] == 1){
            AllRows[0][3] = 99;
            AllRows[2][1] = 99;
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[2][1] == 1){
            AllRows[3][0] = 99;
            AllRows[1][2] = 99;
            Steps++;
            continue;
        } else if(Steps >= 3 && AllRows[3][0] == 1){
            AllRows[2][1] = 99;
            Steps++;
            continue;
        }  else{
            AllRows[0][3] = 0;
            AllRows[1][2] = 0;
            AllRows[2][1] = 0;
            AllRows[3][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 4 && AllRows[0][4] == 1){
            AllRows[1][3] = 99;
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[1][3] == 1){
            AllRows[0][4] = "X";
            AllRows[2][2] = "X";
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[2][2] == 1){
            AllRows[3][1] = "X";
            AllRows[1][3] = 99;
            Steps++;
            continue;
        } else if(Steps >= 4 && AllRows[3][1] == 1){
            AllRows[2][2] = 99;
            AllRows[4][0] = "X";
            Steps++;
            continue;
        } 
      else 
        if(Steps >= 4 && AllRows[4][0] == 1){
            AllRows[3][1] = 99;
            PD = false;
        } else{
            AllRows[0][4] = 0;
            AllRows[1][3] = 0;
            AllRows[2][2] = 0;
            AllRows[3][1] = 0;
            AllRows[4][0] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 5 && AllRows[1][4] == 1){
            AllRows[2][3] = 99;
            Steps++;
            continue;
        } else if(Steps >= 5 && AllRows[2][3] == 1){
            AllRows[1][4] = 99;
            AllRows[3][2] = 99;
            Steps++;
            continue;
        } else if(Steps >= 5 && AllRows[3][2] == 1){
            AllRows[4][1] = 99;
            AllRows[2][3] = 99;
            Steps++;
            continue;
        } else 
          if(Steps >= 5 && AllRows[4][1] == 1){
            AllRows[3][2] = 99;
            PD = false; //null to false
        } else{
            AllRows[1][4] = 0;
            AllRows[2][3] = 0;
            AllRows[3][2] = 0;
            AllRows[4][1] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 6 && AllRows[2][4] == 1){
            AllRows[3][3] = 99;
            Steps++;
            continue;
        } else if(Steps >= 6 && AllRows[3][3] == 1){
            AllRows[2][4] = 99;
            AllRows[4][2] = 99;
            Steps++;
            continue;
        } else if(Steps >= 6 && AllRows[4][2] == 1){
            AllRows[3][3] = 99;
            PD = false;
        } else{
            AllRows[2][4] = 0;
            AllRows[3][3] = 0;
            AllRows[4][2] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
        if(Steps >= 7 && AllRows[3][4] == 1){
            AllRows[4][3] = 99;
            Steps++;
            continue;
        } else if(Steps >= 7 && AllRows[4][3] == 1){
            AllRows[3][4] = 99;
            PD = false;
        } else if(Steps >= 7 && AllRows[4][4] == 1){
            PD = false;
        } else{
            AllRows[3][4] = 0;
            AllRows[4][3] = 0;
            AllRows[4][4] = 0;
            AllRows[GetSV1][GetSV2] = 0;
        }
    }
     else{
        break;
    }
    
}

请注意,最好根据MDN 严格比较布尔值和布尔值。这就是为什么此示例使用“===”运算符进行比较并将 PD 显式设置为 true 或 false。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2011-11-15
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多