Как вычислить последовательные целые, используя метод цикла for и рекурсивный метод? - PullRequest
2 голосов
/ 31 марта 2019

Мне нужно вычислить сумму последовательных целых чисел в 1.) метод цикла for и 2.) рекурсивный метод. Оба метода являются статическими методами типа int, которые принимают два параметра типа int (один - начальный тип int, а другой - число целых чисел, следующих за ним). Например, если бы я должен был ввести (3, 3), выходное значение должно быть 18, потому что 3 - это начальное число, а 3-х - 4, 5 и 6. Когда вы добавляете их все (3 + 4 + 5) +6) вы получаете 18. Оба метода выполняют одну и ту же математику, за исключением того, что один делает это с циклом for, а другой - рекурсивно.

Проблема, с которой я столкнулся, заключается в том, что мой метод for loop не суммирует должным образом. Когда я ввожу (3, 3), вывод равен 31. Кроме того, я не совсем уверен, как написать рекурсивный метод, так как метод for 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

Ответы [ 4 ]

0 голосов
/ 31 марта 2019

для цикла

Проблема в решении цикла 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 */);
}
0 голосов
/ 31 марта 2019

Итерационный подход:

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);
}
0 голосов
/ 31 марта 2019

В вашем 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.

0 голосов
/ 31 марта 2019

Проблема с итеративным решением состоит в том, что вы изменяете начальную точку в каждой итерации. Вместо этого можно использовать отдельную переменную для суммы:

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