使用递归修改求和

时间:2015-11-21 22:16:53

标签: java algorithm recursion

如何使用递归定义修改求和方法,以便通过 - N + (1 to N/2)获得1到((N/2+1) to N)之和? 我在这里有点困惑,我已经输入了类似的东西,但这不是递归:

public static int Sum(int n){
    int sum1 = 0;
    int sum2 = 0;
    int totalSum = 0;
    for(int i = 1; i <= n/2; i++){
        sum1 += i;
    }
    for(int i = n/2 + 1; i <= n; i++){
        sum2 += i;
    }
    totalSum = sum1 + sum2;
    return totalSum;
}

1 个答案:

答案 0 :(得分:4)

首先,你的实现不是递归的。

您的问题说明了正确的算法:要将1和n之间的值相加,您可以将它们加到1和n/2之间,然后加到n/2 + 1n之间。这意味着我们需要创建一个辅助函数sum(int a, int b),其目标是返回ab之间所有值的总和。

  • 基本情况是a == b:在这种情况下,帮助者应该只返回a
  • 在递归步骤中,我们执行上一个算法:从a(a+b)/2求和,从(a+b)/2 + 1求和到b

这将是一个实现:

public static int sum(int a, int b) {
    if (a == b) {
        return a;
    }
    int middle = (a + b) / 2;
    return sum(a, middle) + sum(middle + 1, b);
}

这样,初始任务变为:

public static int sum(int n) {
    return sum(1, n);
}

一些样本:

public static void main(String[] args) {
    System.out.println(sum(4)); // prints 10
    System.out.println(sum(5)); // prints 15
    System.out.println(sum(6)); // prints 21
}