java - 通过在递归方法中将 1 加到 N/2 并将 N/2 加到 N 来计算和 1 到 N

标签 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)。

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

谢谢

最佳答案

在某些情况下可能有助于减少递归深度。

在计算内部步骤的 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);
} 

对于 start 和 n 相差小于 2 的情况,start > n 检查只是避免了最后的额外检查。

关于java - 通过在递归方法中将 1 加到 N/2 并将 N/2 加到 N 来计算和 1 到 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38941117/

相关文章:

java - 游戏框架中的订单相关实体

java - 使用 Flying Saucer 在内存中将图像渲染为 PDF

java - 如何在 grails 中查询特定对象类型的继承对象集合?

java - ANTLR @header、@parser、superClass 选项和基本文件 io (Java)

algorithm - 在段和连接器的集合中检测所有闭合路径的最有效方法是什么?

c++ - 更好的随机算法?

c++ - C++ 中 lambda 和常规函数的不同堆栈深度?

c++ - 如何使用stringstream C++递归打印出二叉搜索树中的所有节点

algorithm - 猜谜游戏加权最佳猜测

javascript - 这个递归函数在 JavaScript 中究竟是如何工作的?