【问题标题】:Syntax issues: Ternary and loop inside return statement语法问题:return 语句中的三元和循环
【发布时间】:2015-10-22 11:48:57
【问题描述】:

我在使用 Java 语法时遇到了一些问题。我试着写一个质数检查,效果很好

public static boolean isPrime(int n) {
        boolean out;
        if (n < 2)
            out = false;
        else if (n == 2)
            out = true;
        else if (n % 2 == 0)
            out = false;
        else {
            double sqrtN = Math.sqrt(n);
            for (int i = 3; ; i += 2) {
                if (i > sqrtN)
                    return out = true;
                else if (n % i == 0)
                    return out = false;
            }
        }
        return out; 
}

现在我想写得更简洁:去掉变量声明out并使用ternary代替if。这是我目前所拥有的:

public static boolean isP(int n) {
        return
            (n < 2) ? false :
            (n == 2) ? true :
            (n % 2 == 0) ? false : {
            double sqrtN = Math.sqrt(n);
            for (int i = 3; ; i += 2) 
                if (i > sqrtN) 
                    return true;
                else if (n % i == 0)
                    return false;
            }
}

我不知道如何处理块语句

                {
                double sqrtN = Math.sqrt(n);
                for (int i = 3; ; i += 2) 
                    if (i > sqrtN) 
                        return true;
                    else if (n % i == 0)
                        return false;
                }

我可以在: 之后加入这个吗?如果我在这里没有遗漏什么,那么循环内的三元是无稽之谈/无论如何都不可能,所以我在那里使用了if/else

那么最外面的return显然缺少分号,我不知道该放在哪里。

希望我的意图得到传达,那么我怎样才能让我的第二个解决方案发挥作用?你有没有进一步的改进/建议我如何写得更好?

【问题讨论】:

    标签: java loops return syntax-error ternary-operator


    【解决方案1】:

    像您建议的那样使用连续的 4 个三元运算符并不是一个好主意,因为它变得有点难以阅读。如果您担心的是代码行数,您可以使用以下方法缩短方法:

    public static boolean isPrime(int n) {
      if (n == 2) return true;
      if (n < 2 || n % 2 == 0) return false;
    
      double sqrtN = Math.sqrt(n);
      for (int i = 3; i <= sqrtN; i += 2) {
        if (n % i == 0) return false;
      }
      return true;
    }
    

    【讨论】:

    • 我习惯于定义常量,否则这些常量会在递归函数中的每次迭代中重新计算。这也是我支持sqrtN 的原因。但是在完全没有必要的循环中,对吗?所以我会直接在循环中写Math.sqrt(n) 作为for (int i = 3; i &lt;= Math.sqrt(n); i += 2) 这样的谓词,它只会计算一次?
    • 你的 out 变量没有用,对性能没有影响。我不确定 sqrt:它将在每次迭代中以解释模式计算 - 一旦 JIT 启动,它可能会缓存该值,但我尚未测试。无论如何, sqrt 可能只花费几纳秒,所以除非你的质数很大,否则不会有太大的不同。
    • 谢谢,在这种情况下,我并不是真的关心性能。只是对评估模型感到好奇。
    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2014-08-28
    • 2010-09-24
    • 2016-06-28
    相关资源
    最近更新 更多