我对编码很陌生,正如大家可以从下面的笨拙代码中看到的那样。但是,查看此代码,您可以看到我正在获得的内容。代码基本上做了它应该的,但我想把它写成一个循环,以使其更有效。有人可能会指出我正确的方向吗?我已经做了一些挖掘和考虑递归,但我还没有弄清楚如何在这里应用它。
public static void main(String[] args) {
double a = 10;
double b = 2;
double c = 3;
double avg = (a + b + c)/3;
double avg1 = (avg + b + c)/3;
double avg2 = (avg1 + b + c)/3;
double avg3 = (avg2 + b + c)/3;
System.out.println(avg+ "\n" + avg1+ "\n"+ avg2 + "\n"+ avg3);
}
答案 0 :(得分:2)
从功能上讲,这与你所做的相同:
public static void main(String[] args) {
double a = 10;
double b = 2;
double c = 3;
double avg = (a + b + c)/3;
System.out.println(avg);
for (int i=0; i<3; i++) {
avg = (avg + b + c)/3;
System.out.println(avg);
}
}
但是你也应该知道更短的代码并不总是意味着有效的代码。解决方案可能更简洁,但我怀疑性能会有任何变化。
答案 1 :(得分:0)
如果你的意思是更短的代码效率,你就可以这样做。
public static void main(String[] args) {
double a = 10;
double b = 2;
double c = 3;
for (int i = 0; i < 4; i++) {
a = (a + b + c) / 3;
System.out.println(a);
}
}
答案 2 :(得分:0)
我不知道这个计算代表什么(某种特殊的加权平均值?),但不是使用重复和循环,你可以通过使用一些代数并重构这些术语来达到完全相同的计算:
public static double directlyCalculateWeightedAverage(double a, double b,
double c) {
return a / 81 + 40 * b / 81 + 40 * c / 81;
}
这种重新制定是因为因子a
在混合中只出现一次,然后除以3 4 ,即81.然后每个b
和{{ 1}}出现在不同的除法级别,因此c
总结为:
b
和b/81 + b/27 + b/9 + b/3
== b/81 + 3b/81 + 9b/81 + 27b/81
== 40b/81
的处理方式完全相同。
这给出了直接计算
c
假设您的公式没有改变,我建议使用这种直接方法,而不是采用重复的计算和循环。
答案 3 :(得分:0)
您的问题可以通过两种方法解决:迭代(使用循环)或递归(使用递归函数)。
for循环允许您重复一组给定次数的指令。 在您的情况下,您可以写下以下内容:
double a = 10, b = 2, c = 3;
double avg = a;
for (int i = 0; i < 4; i++) {
avg = (avg + b + c) / 3;
System.out.println(avg);
}
这将打印您计算的4个第一个结果。
在我的示例中,我覆盖变量avg
以仅保留最后的结果,这可能不是您想要的。为了保持每个循环迭代的结果,您可以将结果存储在数组中。
在Java中,没有独立功能这样的东西。为了使用递归,您必须使用静态方法:
private static double recursiveAvg(double avg, int count) {
// Always check that the condition for your recursion is valid !
if (count == 0) {
return avg;
}
// Apply your formula
avg = (avg + 2 + 3) / 3;
// Call the same function with the new avg value, and decrease the iteration count.
return recursiveAvg(avg, count - 1);
}
public static void main(String[] args) {
// Start from a = 10, and repeat the operation 4 times.
double avg = recursiveAvg(10, 4);
System.out.println(avg);
}
始终检查将结束递归的条件。在我们的示例中,它是应该执行操作的次数。
请注意,大多数程序员更喜欢迭代方法:更容易编写和读取,并且更不容易出错。