通过在递归方法中将N / 2与N相加1到N / 2来计算和1到N.

时间:2016-08-14 10:01:34

标签: java algorithm recursion addition

我无法使用递归方法计算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)。

他让我们这样做让我们更难,但我根本无法理解如何做到这一点。这是对的吗?

谢谢

3 个答案:

答案 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并不总能给你预期的价值。我认为这是你的老师要你观察的伎俩。