如何使用for循环方法和递归方法计算连续整数?

时间:2019-03-31 19:26:47

标签: java loops for-loop recursion int

我需要在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循环方法不起作用,我不确定如何编写递归方法。我可以在这方面得到一些帮助吗?

也没有数组或ArrayList。此代码应该可以在不使用这些代码的情况下工作。

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

4 个答案:

答案 0 :(得分:0)

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

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);
}

答案 1 :(得分:0)

迭代方法:

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);
}

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

用于循环

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 */);
}