嵌套循环没有中断?

时间:2016-06-27 22:45:35

标签: java loops break

处理我应该对素数进行分解的任务。这是我提出的解决方案:

    with open(csv_file, encoding='UTF-8') as f: 
        r = csv.reader(f)
        for row_number, row in enumerate(r):    
            if row_number < 10000000:
                continue
            else:
                process_row(row)      

然而,我正在研究的一本书,强烈反对在循环中使用break语句。那么在这种情况下如果没有一个我该怎么做?

干杯!

4 个答案:

答案 0 :(得分:2)

这是一种做法。我对我的更改做了评论:

import java.util.Scanner;

public class Task8 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.print("Which number to factorize:");

        int number = input.nextInt();

        System.out.println();

        int counter = 1;

        for (int i = 2; i <= number; i++) {
            boolean canBeFactored = true; // Add a flag
            while (canBeFactored && number % i == 0) { // Add a check
                if (counter == 1 && i == number) {
                    System.out.println("The number is a prime, can’t be factorized.");
                    canBeFactored = false; // Set that check to false
                } else {

                    System.out.println("Prime" + " " + "#" + counter + ":" + " " + i);
                    number = number/i;
                    ++counter;
                }
            }
        }
    }
}

答案 1 :(得分:0)

一种可能的解决方案是在休息时间内进行 return 。但这将从整个函数执行返回,这可能不是期望的结果。而且,break语句不一定不好用。请参阅this

答案 2 :(得分:0)

在这种情况下,我认为使用“break”并没有错。虽然如果你非常不想使用它,你可以将main中的所有东西都放到一个新的子程序中,并使用“return”,如下所示:

import java.util.Scanner;

public class Task8 {

    public static void main(String[] args) {

        function();

    }

    public static void function() {

        Scanner input = new Scanner(System.in);

        System.out.print("Which number to factorize:");

        int number = input.nextInt();

        System.out.println();

        int counter = 1;

        for (int i = 2; i <= number; i++) {
            while (number % i == 0) {

                if (counter == 1 && i == number) {
                    System.out.println("The number is a prime, can’t be factorized.");
                    return;
                } else {

                    System.out.println("Prime" + " " + "#" + counter + ":" + " " + i);
                    number = number/i;
                    ++counter;
                }
            }
        }
        return;
    }
}

答案 3 :(得分:0)

这本书可能意味着break(以及continuereturn过度使用使代码无法读取。

E.g。而不是

for (int i = 0; i < N; i++) {
  if (b)
    break;
  ...
}

你可以写

for (int i = 0; i < N && !b; i++) { ... }

最后,我认为这只是风格问题以及您希望用代码表达的内容。

你也可以通过标记它们来打破外部循环:

outer:
for (;;) {
  for(;;) {
    if (<some_special_case>)
      break outer; // execution...
  }
}
// ...continues here

根据没有break的情况(在破坏之前设置附加标志并在所有外部循环中检查),这可能变得相当丑陋。所以最重要的是,break有一些有效的用例,它(在我看来)以最干净,最快捷的方式完成工作(编写代码)。