当前位置: 首页 > 知识库问答 >
问题:

无法理解此行为:while循环中有2个while循环

束作人
2023-03-14

我正在为Codewars做一个kata,它将两个数字数组相对放置。“对手”数组的平均数总是大于“codewarrior”数组,并且两个数组的长度总是相同的。我需要做的是找到获得胜利的最有效方法(codewarrior[x]

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";
    }
}

在上面,我将两个数组从最小到最大排序。然后,我有一个大的while循环来迭代“codefighter or”数组,以及两个time循环和一个if语句,每次迭代“对手”数组时,都会首先检查可能的胜利,其次检查僵局,最后检查失败。它检查获得胜利的最有效方式(codefighter or[x]的值

当我尝试时

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

我预计这两个数组将有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),却导致了僵局?

共有1个答案

施晗昱
2023-03-14

有几件事。。。

你的外循环会遍历你所有的codeWarrior编号。。。这很有道理。。。

你内心对胜利和失败的循环虽然很奇怪...看起来如果代码战士[0]大于对手[0],那么它应该是一场胜利,对吗?但是只有当代码战士[0]输给对手[1]时,你的胜利计数器才会增加。同样的失败交易...如果代码战士[0]输给对手[0],只有当代码战士[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处从代码战士中删除一个数字,在索引y处从对手中删除一个数字。但是,通过使用indexOf(),您是说在code战士中找到战士编号==x的索引并删除该元素。如果在code战士中根本没有找到X的值作为数字,那么什么都不会发生。对手和indexOf(y)也是如此。因此,您很可能会从数组中删除错误的项目,或者如果应该删除,则没有删除。

 类似资料:
  • 只要给定条件为真,Perl编程语言中的while循环语句就会重复执行目标语句。 语法 (Syntax) Perl编程语言中while循环的语法是 - while(condition) { statement(s); } 这里的statement(s)可以是单个陈述或一个陈述块。 condition可以是任何表达。 当条件为真时,循环迭代。 当条件变为假时,程序控制将立即传递到循环之后的行。

  • 编写程序时,您可能会遇到需要反复执行操作的情况。 在这种情况下,您需要编写循环语句以减少行数。 JavaScript支持所有必要的循环,以减轻编程压力。 while循环 JavaScript中最基本的循环是while循环,将在本章中讨论。 while循环的目的是只要expression为真,就重复执行语句或代码块。 表达式变为false,循环终止。 流程图 while loop流程图如下 - 语法

  • 只要给定条件为真,Objective-C编程语言中的while循环语句就会重复执行目标语句。 语法 (Syntax) Objective-C编程语言中while循环的语法是 - while(condition) { statement(s); } 这里, statement(s)可以是单个语句或语句块。 condition可以是任何表达式,true是任何非零值。 当条件为真时,循环迭代。

  • While循环一次又一次地执行相同的代码,直到满足停止条件。 语法 (Syntax) 在R中创建while循环的基本语法是 - while (test_expression) { statement } 流程图 (Flow Diagram) 这里while循环的关键点是循环可能永远不会运行。 当测试条件并且结果为假时,将跳过循环体并且将执行while循环之后的第一个语句。 例子 (Exam

  • 在给定条件为真时重复语句或语句组。 它在执行循环体之前测试条件。 只要给定条件为真, while循环语句就会重复执行目标语句。 语法 (Syntax) 以下是while循环的语法。 while(condition){ statement(s); } 这里, statement(s)可以是单个语句或语句块。 condition可以是任何表达式,true是任何非零值。 当条件为真时,循环迭代。

  • 只要给定条件为真,Swift 4编程语言中的while循环语句就会重复执行目标语句。 语法 (Syntax) Swift 4编程语言中while循环的语法是 - while condition { statement(s) } 这里的statement(s)可以是单个陈述或一个陈述块。 condition可以是任何表达。 当条件为真时,循环迭代。 当条件变为假时,程序控制传递到紧接循环之后