Связанная с рекурсией: произведение двух чисел - PullRequest
0 голосов
/ 16 марта 2012

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

public class test 
{
   public static void main(String[] args)
   {
      int num1 = 10;
      int num2 = 4;

      int res = product(num1, num2);

      System.out.println(res); 
   }

   public static int product(int n1, int n2)
   {
      int result = 0 ;

      if (n2 > 0)
      {
          result = result + n1 ;
          product(n1,n2-1) ;
      }
         return result ;
   }
}

Ответы [ 4 ]

4 голосов
/ 16 марта 2012

лучшее решение * здесь *

public static int product(int n1, int n2) 
           { 
              if (n2 > 1) 
              { 
                  n1 += product(n1,n2-1) ; 
              } 
                 return n1; 
           }
1 голос
/ 16 марта 2012
 public static int product(int n1, int n2)
   {
      int result = 0 ;

      if (n2 > 0)
      {
          result = result + n1 ;
          product(n1,n2-1) ;
      }
         return result ;
   }

В этом коде вы делаете result = 0 каждый раз, когда вызываете метод, что вы явно не хотите делать. Скорее, вы должны сначала инициализировать его в основном коде, а затем передать, как это

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

Тогда, когда вы делаете рекурсию, просто передавайте результат каждый раз!

Вот так:

product(n1, n2-1, result);

Ваш главный должен выглядеть так:

public static void main(String[] args)
   {
      int num1 = 10;
      int num2 = 4;
      int result = 0;

      int res = product(num1, num2, result);

      System.out.println(res); 
   }

Что это сделает, так это сделает значение результата доступным для вашей функции, инициализировано.

Edit:

При выполнении рекурсии мы должны помнить, чтобы установить то, что мы хотим вернуть в функцию, которую мы вызываем, а не просто снова вызывать функцию, в противном случае будет возвращен первоначальный ответ (в этом случае значение n1). 1017 *

Сделай так:

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

      if (n2 > 0)
      {
          result = result + n1 ;
          result = product(n1,n2-1, result) ;
      }
         return result ;
   }
}
0 голосов
/ 16 марта 2012

Более короткое решение

public static int product(int n1, int n2) {
    return n2 == 0 ? 0 : n1 + product(n1, n2-1);
}

Оптимизировано было это сделать (что аналогично тому, как на самом деле реализовано умножение в процессоре):

public static int product(int n1, int n2) {
    if (n2 == 0) return 0;
    int p = product(n1, n2 >> 1);
    return p + p + ((n2 & 1) == 0 ? 0 : n1);
}

Это будет повторяться до 31 раза, тогда как первое решение может повторяться более 2 миллиардов раз.

0 голосов
/ 16 марта 2012
public class Test{
static int result;
public static void main(String...x){
    int num1 = 10;
      int num2 = 4;

      int res = product(num1, num2);

      System.out.println(res); 
   }

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


      if (n2 > 0)
      {
          result = result + n1 ;
          product(n1,n2-1) ;
      }
         return result ;
   }
}

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

...