繁体   English   中英

使用递归修改求和

[英]Modifying Summation using Recursion

如何修改使用递归定义获得的1总和求和法N -通过(1 to N/2) + ((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和n之间的值相加,可以将1和n/2之间的值相加,然后将n/2 + 1n之间的值相加。 这意味着我们需要创建一个辅助函数sum(int a, int b)其目标是返回ab之间所有值a和。

  • 基本情况是当a == b :在这种情况下,助手应该只返回a
  • 在递归步骤中,我们执行以前的算法:从a(a+b)/2总和,从(a+b)/2 + 1b总和。

这将是一个实现:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM