Java 代码搜寻游戏02.05

Java 代码搜寻游戏02.05,java,Java,这个想法是尽可能地编写最优雅的代码。本节主题:循环。 任务:返回从1到(n-1)的数字平方和 示例:6->55(即1^2+2^2+3^2+4^2+5^2) 我选择Java作为语言,并编写了以下代码: public class Program { public static int Puzzle(int n) { int r=0; for(--n;n>=0;r+=n*n--); return r; } } 但编译器说我的代码不

这个想法是尽可能地编写最优雅的代码。本节主题:循环。 任务:返回从1到(n-1)的数字平方和 示例:6->55(即1^2+2^2+3^2+4^2+5^2)

我选择Java作为语言,并编写了以下代码:

public class Program {
    public static int Puzzle(int n) {
        int r=0;
        for(--n;n>=0;r+=n*n--);
        return r;
    }
}
但编译器说我的代码不够优雅。你能帮忙吗?
链接:

几个非常不雅的方面:

  • 内联递增/递减:它们使代码非常混乱,因为大多数人不知道变量何时实际递减,例如
    m=(n-)*(-n)会发生什么(答案是
    m=n*(n-2);n-=2;
    )。对于一些小的简单表达式,内联减量使代码更易于阅读。但在几乎所有情况下,性能都没有提高,因为编译器足够聪明,可以将可读代码转换为具有内联递增/递减功能的代码
  • 没有正文的循环:大多数人只是感到困惑,认为下一条指令是正文的一部分,等等。大多数IDE甚至建议始终使用大括号并在正文中写一些东西
  • 对参数的操作:这会让人困惑,并降低代码的可扩展性。假设您想用下面的某个部分扩展代码,并执行“复制过去”,因为参数没有其原始值,所以粘贴的代码将以不同的方式工作。我建议至少复印一份。如果没有进一步使用参数,几乎每个编译器都可以对此进行优化
  • for循环中的减量:虽然这有时会在代码性能上产生一些小的改进,但大多数程序员都习惯于使用增加的for循环
  • 语义变量名(编译器无法检测):建议您正确命名变量,使用
    sum
    而不是
    r
    。java编译器仅将名称视为标识符。所以在运行时并没有什么区别,但是,当您几个月后重新访问代码时,它对其他人和您自己来说更具可读性
这些都是编写算法的非常糟糕的方法。大多数书籍都强烈建议,除非您真的需要编写一个占用CPU绝对最大容量的代码,否则最好编写漂亮、结构良好且可读的代码。而且如果是这样的话,还有比Java更高效的语言


作为更好的版本,我建议使用以下代码:

public class Program {

    public static int Puzzle(int n) {
        int sum = 0;
        for(int i = 1; i < n; i++) {
            sum += i*i;
        }
        return sum;
    }

}

优雅可能是简单和准确的结合。你的方法最大的问题是它不简单;它可能会产生正确的结果,但由于不寻常的迭代和运行for循环的副作用,它会变得不必要的复杂

为什么不采用更直接的方法呢

public static Puzzle(int n) {
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        sum += Math.pow(i, 2);
    }
    return sum;
}
公共静态拼图(int n){
整数和=0;

对于(inti=1;i您不需要循环该序列。请参阅


这属于代码高尔夫:你能粘贴你的编译器给你的实际信息说它不优雅吗?它一句话也没说,但它以“技能”块来衡量结果.对于3个区块,它说代码很优雅,但不管我做什么-我总是只得到2个区块你不需要循环。它非常低效。前n个平方和是一个众所周知的序列。尝试:
public class程序{public static int Puzzle(int n){int x=n-1;返回x*(x+1)*(2*x+1)/6;}
这个问题似乎离题了,因为它属于另一个站点:可能是codegolf或CodeReview,我会用
n*n
替换
Math.pow(n,2)
,因为
n
是整数,对于小幂次,展开的版本更可读。此外,因为
n
是整数,它会更有效(否则必须首先解释
2
,等等)。此外,你应该总结为
i*i
,而不是
n*n
。不过,它说它不够好。我认为它需要一些小而明显的东西,比如返回数组。sum(0,n)但我不知道是否存在这样的操作@morrizon状态下,您根本不需要for循环,您只需使用求和展开:^2%20with%20i%20from%201%20to%20n
public static Puzzle(int n) {
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        sum += Math.pow(i, 2);
    }
    return sum;
}
public class Program {
    public static int Puzzle(int n) {
    int x = n -1;
    //sum of first n-1 squares
    return x*(x+1)*(2*x+1)/6;
    }
}