更具表现力的代码

More Expressive Code

是否有更智能的方法来编写此代码,避免在 WHILE 和 IF 中重复条件 (answer<200)?

 public class HelloWorld
{
  public static void main(String[] args)
  {
  perfectSquareBetweenFifteenAndTwoHundred();
  }
 }

 void perfectSquareBetweenFifteenAndTwoHundred(){

   int i=1;
   int answer=0;

    while(answer<200)
    {
      answer = i*i;

         if(answer>15 && answer<200)
         {
         System.out.println(i*i);
         }

      i++;
    }
 }
}

谢谢。

将它写成一个 for 循环,并带有适当的边界(从 4 开始,因为 4*4=16 > 153*3=9 < 15;在 14 结束,因为 14*14=196 < 20015*15=225 > 200

for (int i = 4; i <= 14; ++i) {
  System.out.println(i*i);
}

如果你想让数字 4 和 14 相对于 15 和 200 的界限少 "magical",你可以这样写循环:

for (int i = (int) Math.ceil(Math.sqrt(15)), squared;
     (squared = i * i) < 200; ++i) {
  System.out.println(squared);
}

如果你想保留 while 循环,你可以这样做:

 public class HelloWorld {
     public static void main(String[] args){
          perfectSquareBetweenFifteenAndTwoHundred();
     }


     void perfectSquareBetweenFifteenAndTwoHundred(){

          int i=4;
          int answer=0;

          while(answer<200){
                System.out.println(answer);
                answer = i*i;
                i++;
         }
     }
}

以上代码的工作原理如下: 基本上每次迭代打印出的答案都是根据前一次迭代计算得出的。 老实说,您应该避免编写这种代码,因为它依赖于前一次迭代的变量状态,而且乍一看代码的工作原理并不明显。

public class MyClass {
    public static void main(String[] args) {
        for (int i = 1; true; i++) {
            int square = i * i;
            if (square > 200) {
                return;
            }
            if (square > 15) {
                System.out.println(square);
            }
        }
    }
}