繁体   English   中英

无法弄清楚这种行为:while 循环中的 2 个 while 循环

[英]Can't figure out this behavior: 2 while loops inside a while loop

我正在为Codewars做一个 kata,它将两个 arrays 的数字放在一起。 “对手”数组的平均数字总是比“codewarrior”数组大,而且 arrays 的长度总是相同的。 我需要做的是找到最有效的方法来获得胜利(codewarrior[x] >对手[y]),如果无法取得胜利或失败( codewarrior[x] <对手[y]) 如果胜利或僵局都不可能。 在有人问之前,我不想要 kata 的解决方案,只想要如何让我的程序工作。

function codewarResult(codewarrior, opponent) {
    codewarrior = codewarrior.sort(function(a, b){return a - b});
    opponent = opponent.sort(function(a, b){return a - b});

    console.log("Ordered codewarrior array: ", codewarrior);
    console.log("Ordered opponent array:", opponent);

    let victories = 0;
    let stalemates = 0;
    let defeats = 0;
    
    let x = 0;
    while(x < codewarrior.length) {
        let y = 0;
        while(codewarrior[x] > opponent[y]) { // Victory loop (most preferable)
            if(codewarrior[x] <= opponent[y + 1]) {
                victories++;
                codewarrior.splice(codewarrior.indexOf(x), 1, null); // I replace the value to null so the array retains it's length
                opponent.splice(opponent.indexOf(y), 1);
                console.log(`Codewarrior array after victory: `, codewarrior);
                console.log(`Opponent array after defeat: `, opponent);
            }
            y++;
        }
        if(codewarrior[x] == opponent[y]) { // Stalemate checker (second most preferable)
            stalemates++;
            codewarrior.splice(codewarrior.indexOf(x), 1, null);
            opponent.splice(opponent.indexOf(y), 1);
            console.log(`Codewarrior array after stalemate: `, codewarrior);
            console.log(`Opponent array after stalemate: `, opponent);
        }
        while(codewarrior[x] < opponent[y]) { // Defeat loop (least preferable)
            if(codewarrior[x] >= opponent[y + 1]) {
                defeats++;
                codewarrior.splice(codewarrior.indexOf(x), 1, null);
                opponent.splice(opponent.indexOf(y), 1);
                console.log(`Codewarrior array after defeat: `, codewarrior);
                console.log(`Opponent array after victory: `, opponent);
            }
            y++;
        }
        x++;
    }
    
    console.log(`victories: ${victories}, stalemates: ${stalemates}, defeats ${defeats}.`);
    
    if(victories > defeats) {
      return "Victory";
    } else if(victories === defeats) {
      return "Stalemate";
    } else {
      return "Defeat";
    }
}

上面我订购了从小到大排列的两个 arrays。 然后我有一个大的while循环来迭代“codewarrior”数组,两个while循环和一个if语句在每次迭代“对手”数组时首先检查可能的胜利,然后是僵局,最后是失败。 它检查获得胜利的最有效方法(codewarrior[x] >尽可能分开)。

当我尝试

codewarResult([4,3,2,1], [5,4,3,2]);

我希望两个 arrays 彼此有 4 次“战斗”,随着大型 while 循环迭代,“codewarrior”的值慢慢变为 null。 相反,我在控制台中得到了这种行为:

Ordered codewarrior array:  [ 1, 2, 3, 4 ]
Ordered opponent array: [ 2, 3, 4, 5 ]
Codewarrior array after stalemate:  [ null, 2, 3, 4 ]
Opponent array after stalemate:  [ 2, 3, 4 ]
Codewarrior array after victory:  [ null, null, 3, 4 ]
Opponent array after defeat:  [ 2, 3 ]
Codewarrior array after stalemate:  [ null, null, 3, null ]
Opponent array after stalemate:  [ 2 ]
victories: 1, stalemates: 2, defeats 0.

为什么只记录了 3 场战斗,而跳过了“codewarriors”数组中的 3 场? 为什么第一场比赛本应该是失败(1对5)却陷入胶着?

几件事...

你的外循环遍历你所有的 codeWarrior 号码......这是有道理的......

你的胜利和失败的内在循环虽然很奇怪......看起来如果 codeWarrior[0] 大于对手 [0] 那么它应该是胜利吧? 但是只有当 codeWarrior[0] 输掉/与对手 [1] 相持时,你的胜利计数器才会增加。 同样的失败交易...如果 codeWarrior[0] 输给了对手 [0],则只有在 codeWarrior[0] 与对手 [1] 获胜/僵持时才算失败。

至于没有你认为应该的战斗次数……看这里:

if(codewarrior[x] == opponent[y]) { // Stalemate checker (second most preferable)
stalemates++;
codewarrior.splice(codewarrior.indexOf(x), 1, null);
opponent.splice(opponent.indexOf(y), 1);

您可能打算从索引 x 处的 codeWarrior 中删除单个数字,并从索引 y 处的对手中删除单个数字。 但是,通过使用 indexOf(),您是说在 codeWarrior 中找到战士编号 == x 的索引并删除该元素。 如果在 codeWarrior 中根本没有找到 X 的值作为数字,那么什么也不会发生。 对手和 indexOf(y) 相同。 因此,您很可能从 arrays 中删除了错误的项目,或者如果它们应该删除则没有删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM