Произведение двух чисел с использованием рекурсии java

#java

#java

Вопрос:

Я действительно запутался в этой программе:

 public static int product(int n1, int n2) {

    if (n2== 0 || n1==0) {
       return 0;
    }
      n1  = product(n1, n2 - 1);
     return n1;
}
  

Предположим, я создал произведение (3,2), тогда функция must возвращает:

Значения 3>0 и 2> 0, тогда n1 = 3 произведение (3,1)

Значения 3>0 и 1> 0, тогда n1 = 3 3 произведение (3,1)

3> 0, но 0 ==0 затем возвращает 0; но это возвращает 6.

Может ли кто-нибудь это объяснить?

Комментарии:

1. 3 3 равно 6. Есть ли проблема с этим?

2. Выполните это в своем отладчике. Это прояснит ситуацию.

3. Примечание сбоку: Нет необходимости писать обратно в n1 . Просто return n1 product(n1, n2 - 1);

4. Да, он возвращает 0 при этой рекурсии. Поскольку вызов разрешен, он проходит весь путь вверх по стеку до того места, где вы его впервые вызвали, и возвращает 6.

5. @Br.sasa это вернет ноль, а не 3.

Ответ №1:

Вы правы в своем объяснении того, как работает метод, но помните, поскольку это рекурсивный метод, в конечном итоге он возвращает сумму всех возвратов. Позвольте мне объяснить: первая рекурсия возвращает 3 произведение (3, 1). Однако ваша программа еще не знает, что такое произведение (3, 1), поэтому оно должно продолжаться перед возвратом. Вторая рекурсия (произведение(3, 1)) возвращает 3 произведение(3, 0). Опять же, ваша программа должна продолжить рекурсию, чтобы найти произведение(3,0). Третья и последняя рекурсия возвращает 0, как вы сказали, но ОКОНЧАТЕЛЬНЫЙ ответ восходит к ответу первой рекурсии, 3 произведение (3, 1). Мы знаем, что произведение (3,1) = 3 произведение(3,0), а произведение (3,0) = 0. Итак, произведение(3, 2) = 3 3 0, которое равно 6. В вашем ответе указано, что вы ожидали получить только окончательную рекурсию для ответа, но из-за вашего оператора return это комбинация из трех.