2015-05-11 3 views
-4

Вот простой вопрос о рекурсии в java. Этот, над которым я работал, но нуждается в уточнении своего подхода.Простой рекурсивный алгоритм Java

Напишите рекурсивный метод с двумя параметрами int, m и n. Предварительное условие требует 0 < = m и m < = n. Метод печатает строку из звездочек, затем строку из m + 1 звездочек и т. Д. Вплоть до строки из n звездочек. Затем повторяется одна и та же картина назад: строка из n звездочек, затем n-1 и т. Д. Вниз до n. Единственный цикл, разрешенный в вашей реализации, - это цикл для печати строки из звездочек.

Это то, что я до сих пор в качестве методов испытаний

package Recursion; 

class Asterisk 
{ 
    public static void asterisk(int m, int n) 
    { 
     if (m == n) 
     { 
      printAsterisk(n); 
      return; 
     } 
     else if (m < n) 
     { 
      printAsterisk(m); 
      asterisk(m + 1, n); 
     } 
     else 
     { 
      printAsterisk(m); 
      asterisk(m - 1, m); 
     } 
    } 

    public static void printAsterisk(int m) 
    { 
     for (int i = 0; i < m; i++) 
     { 
      System.out.print("*"); 
     } 
      System.out.println(""); 
    } 

    public static void main(String[] args) 
    { 
     int m = 3; 
     int n = 5; 

     asterisk(m, n); 
    } 
} 

Подумайте об этом так: printAsterisk (6, 5) ничего не печатает. printAsterisk (3, 5) печатает 3 звездочки, затем вставляет printAsterisk (4, 5), затем снова печатает 3 звездочки.

Ожидаемый выход

printAsterisk(3, 5) 
*** 
**** 
***** 
***** 
**** 
*** 

Мой выходной ток

printAsterisk(3, 5) 
*** 
**** 
***** 
+1

'Как распечатать, используя только один вызов метода в main?' Теперь у вас есть только один вызов метода в main() (и у вас также есть две объявления переменных). –

+0

'Предварительное условие требует 0 <= m и m <= n' Если это всегда так, вы можете избавиться от случая else, который обрабатывает m> n. Тем не менее, для реального кода я бы оставил его (потребители вашего кода вряд ли помнят, что предусловие лет в будущем). –

+0

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

ответ

0

Это намного проще.

public static void asterisk(int m, int n) { 
    printAsterisk(m); 
    if (m < n) { 
     asterisk(m + 1, n); 
    } 
    printAsterisk(m); 
} 

Просто распечатайте m звездочку в начале и в конце функции. И только если m меньше n recurse с m + 1.

В случае предупреждения две печатные строки, если m > n это сделать:

public static void asterisk(int m, int n) { 
    if (m <= n) { 
     printAsterisk(m); 
     asterisk(m + 1, n); 
     printAsterisk(m); 
    } 
} 
+0

Это все еще печатает 2 строки звездочек, даже если 'm> n', вы должны добавить для этого catch. – StrongJoshua

+0

Я добавил случай для 'm> n'. – Nicolas

+0

Как это декрементирует? Он отлично работает, но я не понимаю, как –

0

Это не является хорошим решением, лучше так, как у вас есть. Почему вы хотите его только с помощью одного метода?

package Recursion; 

class Asterisk 
{ 
    public static void asterisk(int m, int n) 
    { 
     if (m == n) 
     { 
      for (int i = 0; i < n; i++) 
     { 
      System.out.print("*"); 
     } 
      System.out.println(""); 
     } 
     else if (m < n) 
     { 
      for (int i = 0; i < m; i++) 
     { 
      System.out.print("*"); 
     } 
      System.out.println(""); 

      asterisk(m + 1, n); 
     } 
     else 
     { 
      for (int i = 0; i < m; i++) 
     { 
      System.out.print("*"); 
     } 
      System.out.println(""); 
      asterisk(m - 1, m); 
     } 
    } 

    public static void main(String[] args) 
    { 
     int m = 3; 
     int n = 5; 

     asterisk(m, n); 
    } 
+0

Вы можете изменить существующий код. Не должен быть одним методом.Мне нужно вызвать метод только один раз из основного. –

0

Прежде всего, это своего рода грязный. У вас есть оператор return внутри вашего первого метода, который недействителен, поэтому он, безусловно, не будет работать. Но проблема заключается в том, что вы не должны использовать метод void в первую очередь, потому что вам нужен оператор return, чтобы заставить его работать рекурсивно, вместо того, чтобы называть его изнутри. (Write return asterisk (m + 1, n) внутри оператора «else if» и вернуть звездочку (m-1, n) внутри «else»). Тогда написание звездочки (m, n) на главном должно сделать трюк. Извините за любые грамматические проблемы, я пишу на планшете

+0

так как это право? if (m == n) { printAsterisk (n); return n; } else if (m

Смежные вопросы