【问题标题】:How to calculate consecutive integers using a for loop method and a recursive method?如何使用 for 循环方法和递归方法计算连续整数?
【发布时间】:2019-08-21 23:57:22
【问题描述】:

我需要计算 1.) for 循环方法和 2.) 递归方法中连续整数的总和。这两种方法都是静态 int 方法,它们接受两个 int 参数(一个是起始 int,另一个是后面的 int 数量)。例如,如果我要输入 (3, 3),输出应该是 18,因为 3 是起始数字,后面的 3 个整数是 4、5 和 6。当你把它们加起来时 (3+4+5 +6) 你得到 18。这两种方法都在做同样的数学运算,除了一个是用 for 循环做的,另一个是递归做的。

我在这里遇到的问题是我的 for 循环方法没有正确总结。当我输入 (3, 3) 时,输出为 31。此外,我不太确定如何编写递归方法,因为我的 for 循环方法不起作用。我可以得到一些帮助吗?

此外,没有数组或数组列表。这段代码应该能够在不使用它们的情况下工作。

public static int consecSum(int startingNum, int numInts){
    for (int i = numInts; i>0; i--){
        startingNum += (startingNum + 1);
    }
    return startingNum;
}
public static int recursSum(int startingNum, int numInts) {
    if (startingNum == 0) {
        return 0;
    } else if (numInts == 0) {
        return startingNum;
    }
    return startingNum + recursSum(startingNum + numInts, numInts - 1);
}
3 \\startingNum (theres more code not shown where I use a scanner object to input these)
3 \\numInts
31 \\for loop output
\\The recursive method just prints an error message

【问题讨论】:

    标签: java loops for-loop recursion int


    【解决方案1】:

    For 循环

    您的 for 循环解决方案中的问题是您认为“最后一个整数”实际上是“最后一个总和”。你是说

    startingNum = 3
    startingNum = 3 + 4
    startingNum = 7 + 5
    startingNum = 12 + 6
    

    但由于您始终将新的总和保存在 startingNum 本身中,这就是正在发生的事情

    startingNum = 3
    startingNum = 3 + 4
    startingNum = 7 + 8 (because startingNum + 1 = 7 + 1 = 8)
    startingNum = 15 + 16
    

    试试这个

    public static int consecSum(int startingNum, int numInts){
        int nextNum = startingNum + 1;
        for (int i = numInts; i>0; i--){
            startingNum += nextNum;
            nextNum++;
        }
        return startingNum;
    }
    

    递归

    你几乎拥有它。根据我所看到的,您的思考过程是如果整数数为 0,则返回起始数字,否则返回起始数字 + 下一个数字调用的方法的输出。这绝对是有效的。试试这些修改

    public static int recursSum(int startingNum, int numInts) {
        if (numInts == 0) {
            // eventually the numInts will become 0, meaning there's no
            // numbers to add after this startingNum, so just return it
            return startingNum;
        }
    
        // otherwise, if numInts > 0, that means there are other numbers to add so
        // return the sum of the current number with the output of the function called
        // on the next number (while not forgetting to decrease the number of integers
        // we should consider after that)
        return startingNum + recursSum(startingNum + 1 /* next number */, numInts - 1 /* decrease the number of integers to consider after that */);
    }
    

    【讨论】:

      【解决方案2】:

      迭代解决方案的问题在于您在每次迭代中都修改了起点。相反,可以为总和使用单独的变量:

      public static int consecSum(int startingNum, int numInts){
          int sum = 0;
          for (int i = numInts; i>0; i--){
              sum += (startingNum + 1);
          }
          return sum;
      }
      

      递归实现也有类似问题:

      public static int recursSum(int startingNum, int numInts) {
          if (numInts == 0) {
              return startingNum;
          }
          return startingNum + recursSum(startingNum + 1, numInts - 1);
      }
      

      【讨论】:

        【解决方案3】:

        迭代方法:

        public static int consecSum(int startingNum, int numInts){
                int sum = startingNum++;
                for (int i = numInts; i>0; i--, startingNum++;){
                    sum += startingNum;
                }
                return sum;
            }
        

        递归方法:

        public static int recursSum(int startingNum, int numInts) {
                if (numInts < 0) {
                    return startingNum;
                }
                return startingNum + recursSum(startingNum+1, numInts - 1);
        }
        

        【讨论】:

          【解决方案4】:

          在您的consecSum() 中,您正在使用startingNum += (startingNum + 1) 更新循环中的startingNum

          您应该为结果使用一个新变量:

          public static int consecSum(int startingNum, int numInts) {
              int result = startingNum;
              for (int i = numInts; i > 0; i--) {
                  result += (startingNum + i);
              }
              return result;
          }
          

          在您的recursSum 中,您将在每次迭代中添加startingNum + numInts。只需添加1

          public static int recursSum(int startingNum, int numInts) {
              if (numInts <= 0) {
                  return startingNum;
              }
              return startingNum + recursSum(startingNum + 1, numInts - 1);
          }
          

          (3, 3) 在这两种情况下的结果都是18

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-03-24
            • 2017-10-26
            • 1970-01-01
            • 1970-01-01
            • 2021-12-21
            • 1970-01-01
            • 2014-06-30
            相关资源
            最近更新 更多