如何编写Javascript for循环以便在满足第一个条件时它会中断?

时间:2016-02-26 20:04:38

标签: javascript

我试图编写一个脚本来找到最大的公因子(最高公因子/ HCF),但是循环向下计数,所以我想在找到第一个公因子后立即中断(因为它向下计数)所以这也是HCF)。

但是,我的代码结果显示了所有常见因素,并且一旦找到4,就没有突破循环,HCF为12和8。

这是:

function maxi(a, b) {
  for (var i = a; i >= 1; i--) {
    for (var j = b; j >= 1; j--) {
      if (a % i == 0) {
        if (b % j == 0 && i == j) {
          console.log(i);
          break;
        }
      }
    }
  }
}
maxi(12, 8);

6 个答案:

答案 0 :(得分:5)

我猜你有正确的逻辑。

只需更改

 if (b % j == 0 && i == j){
                    console.log(i);
                    break;
            }

   if (b % j == 0 && i == j){
                        console.log(i);
                        return;
                }

答案 1 :(得分:4)

这样做的一种方法是使用“return”而不是“break”。

function maxi(a,b){
    for (var i=a; i>=1; i--){
        for (var j=b; j>=1; j--){
            if (a % i == 0){
                if (b % j == 0 && i == j){
                    return i;
                }
            } 
        }
    }
}

console.log(maxi(12,8));

答案 2 :(得分:4)

像这样标记你的循环:

function maxi(a,b) { 
loop1:
    for (var i = a; i >= 1; i--){
loop2:
        for (var j = b; j >= 1; j--){
            if (a % i == 0){
                if (b % j == 0 && i == j){
                    console.log(i);
                    break loop2; // Breaks out of all loops.
                }
            } 
        }
    }
}

maxi(12,8);

人们忘记了这些存在,但它们是语言中完全有效的部分。

答案 3 :(得分:1)

您只需要测试是否已达到所需的输出,并在外部for循环中放入第二个断点,就像这样。

function maxi(a,b){
    var iAmFinished = false;
    for (var i=a; i>=1; i--){
        for (var j=b; j>=1; j--){
            if (a % i == 0){
                if (b % j == 0 && i == j){
                    console.log(i);
                    iAmFinished = true;
                    break;
            }
            }
        }
        if (iAmFinished) {
            break;
        }
    }
}
maxi(12,8);

答案 4 :(得分:0)

当你中断时,除非另有指定,否则你会从最近的循环中断。

您可以使用label指定要中断的特定循环。

function maxi(a, b) {
  outer:
  for (var i = a; i >= 1; i--) {
    inner:
    for (var j = b; j >= 1; j--) {
      if (a % i == 0) {
        if (b % j == 0 && i == j) {
          console.log(i);
          break outer;
        }
      }
    }
  }
}
maxi(12, 8);

答案 5 :(得分:0)

有两种同样优雅的方法可以达到同样的效果。

选项1:

使用return代替break

function maxi(a, b) {
  for (var i = a; i >= 1; i--) {
    for (var j = b; j >= 1; j--) {
      if (a % i == 0) {
        if (b % j == 0 && i == j) {
          console.log(i);
          return;
        }
      }
    }
  }
}
maxi(12, 8);
  

当在函数中调用return语句时,执行此操作   功能停止了。如果指定,则返回给定值   功能来电。如果省略表达式,则返回undefined   代替。

     

source

选项2:

breaklabel结合使用:

function maxi(a, b) {
  outerloop:
  for (var i = a; i >= 1; i--) {
    for (var j = b; j >= 1; j--) {
      if (a % i == 0) {
        if (b % j == 0 && i == j) {
          console.log(i););
          break outerloop;
        }
      }
    }
  }
}
maxi(12, 8);
  

带标签的语句可以与break或continue语句一起使用。   它为带有标识符的语句添加前缀,您可以参考该标识符。

     

[...]

     

您可以使用标签来标识循环,然后使用break或   继续声明以指示程序是否应该中断   循环或继续执行。

     

source