Java 代码搜寻游戏02.05
这个想法是尽可能地编写最优雅的代码。本节主题:循环。 任务:返回从1到(n-1)的数字平方和 示例:6->55(即1^2+2^2+3^2+4^2+5^2) 我选择Java作为语言,并编写了以下代码: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; } } 但编译器说我的代码不
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
。java编译器仅将名称视为标识符。所以在运行时并没有什么区别,但是,当您几个月后重新访问代码时,它对其他人和您自己来说更具可读性r
作为更好的版本,我建议使用以下代码:
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;
}
}