我无法使用递归方法计算1,2,3到N的总和,但是通过将(1,2,3 ...到N / 2)与(N / 2 + 1)相加来实现它......到N)。
我目前管理的代码是:
public static void main(String[] args) {
System.out.println(sum(10, 1));
}
public static int sum(int n, int start) {
if (start == n){
return n;
}
if (start > n / 2){
return start + sum(n, start + 1);
}
return start + sum(n, start + 1);
}
我认为这是错误的,这是在学校的一项任务,我们必须激励如何将递归分解为部分是计算总和的更多/更低效的方法。 (将数字从1添加到N / 2,N / 2到N,而不是直接从1到N)。
他让我们这样做让我们更难,但我根本无法理解如何做到这一点。这是对的吗?
谢谢
答案 0 :(得分:2)
在某些情况下可能有助于减少递归深度。
在为内部步骤计算n / 2时,您需要考虑到开始,代码应该看起来与此类似:
public static int sum(int n, int start) {
if (start > n) {
return 0;
}
if (start == n){
return n;
}
int n2 = (start + n) / 2;
return sum(n2, start) + sum(n, n2 + 1);
}
开始> n检查只是避免在start和n小于2的情况下在末尾进行额外检查。
答案 1 :(得分:0)
我相信,这段代码尽可能简单,你可以在循环中检查性能。我没有看到复杂性有任何差异。
class Sums {
public static int sumHelp(int n, int start){
if (n == start) return;
else return (n + sumHelp(n - 1, start));
}
public static int sumByHalf(int n){
return sumHelp(n/2, 0) + sumHelp(n, n/2);
}
public static int sum(int n){
return sumHelp(n, 0);
}
public static void main(String[] args) {
System.out.println(sumByHalf(100));
System.out.println(sum(100));
}
}
答案 2 :(得分:-1)
检查你是否已将n声明为int。 n / 2并不总能给你预期的价值。我认为这是你的老师要你观察的伎俩。