Вопрос или проблема
Я пытаюсь решить эту домашнюю задачу:
Напишите метод под названием sumOfPreviousN, который принимает два целых числа и возвращает сумму первого числа минус кратные второму числу. Например, sumOfPreviousN(9, 4) вернет 6, так как будет сложено 5 + 1. sumOfPreviousN(20, 6) вернет 24, так как будет сложено 14 + 8 + 2.
Мы еще не изучали циклы, поэтому нам разрешено использовать только рекурсию.
Вот что у меня есть на данный момент:
public class help {
public static int sumOfPreviousN(int num1, int num2) {
if (num1 <= num2) {
return num1 + num2;
} else {
int subtracted = num1 - num2;
return subtracted + sumOfPreviousN(subtracted, num2);
}
}
public static void main(String[] args) {
int num1 = 20;
int num2 = 6;
System.out.println(sumOfPreviousN(num1, num2));
}
}
Мне кажется, что мне нужно использовать третью переменную, которой не хватает, но точно есть способ! Я не уверен, как в этом примере продолжать вычитание 6, при этом отслеживая как значения, уменьшающиеся на 6, так и значения, которые добавляются после этого.
Ответ или решение
Конечно! Давайте разберем вашу задачу и предложим правильное решение с использованием рекурсии в Java.
Ваша задача заключается в создании метода sumOfPreviousN
, который принимает два целых числа и возвращает сумму первого числа, уменьшенного на кратные второго числа. Как вы правильно заметили, поскольку вам не разрешено использовать циклы, мы должны использовать рекурсию для решения этой задачи.
Вот способ, как можно реализовать этот метод:
public class Helper {
public static int sumOfPreviousN(int num1, int num2) {
// Базовый случай: если num1 меньше или равно 0, возвращаем 0.
if (num1 <= 0) {
return 0;
} else {
// Рекурсивный случай: вычитаем num2 из num1 и добавляем к результату рекурсивного вызова
return num1 + sumOfPreviousN(num1 - num2, num2);
}
}
public static void main(String[] args) {
// Пример использования метода
int num1 = 20;
int num2 = 6;
System.out.println("Сумма: " + sumOfPreviousN(num1, num2)); // Ожидается 24
num1 = 9;
num2 = 4;
System.out.println("Сумма: " + sumOfPreviousN(num1, num2)); // Ожидается 6
}
}
Объяснение кода
-
Базовый случай: Если
num1
становится меньше или равно 0, мы возвращаем 0. Это остановит рекурсию, когда мы достигнем конца вычислений. -
Рекурсивный случай: Если
num1
больше 0, мы добавляемnum1
к результату рекурсивного вызоваsumOfPreviousN
, гдеnum1
уменьшено наnum2
. Это позволяет нам поэтапно вычислять сумму чисел, уменьшаяnum1
наnum2
на каждом шаге.
Пример работы
- Для
sumOfPreviousN(20, 6)
:- 20 + sumOfPreviousN(14, 6)
- 14 + sumOfPreviousN(8, 6)
- 8 + sumOfPreviousN(2, 6)
- 2 + sumOfPreviousN(-4, 6) (здесь рекурсия останавливается и возвращается 0)
Таким образом, итоговая сумма будет 20 + 14 + 8 + 2 = 44.
- Для
sumOfPreviousN(9, 4)
:- 9 + sumOfPreviousN(5, 4)
- 5 + sumOfPreviousN(1, 4)
- 1 + sumOfPreviousN(-3, 4) (здесь рекурсия останавливается и возвращается 0)
Итоговая сумма будет 9 + 5 + 1 = 15.
Заключение
С помощью данного подхода вы можете решить задачу, не прибегая к циклам, обеспечивая рекурсивное выполнение. Уверен, что это поможет вам в вашем задании! Если у вас есть дополнительные вопросы, не стесняйтесь обращаться.