2014-11-11 5 views
2

Я получил упражнение, чтобы написать функцию дважды, один раз рекурсивного, когда итеративный, который будет производить следующий вывод:Преобразование итерационного цикла к методу рекурсивного

private static void printSequence(int n) 

printSequence(3); 

1 
12 
123 
12 
1 

Моего итерационным решения заключается в следующем:

for (int i = 1; i < 2 * n; i++) { 
    for (int j = 1; j <= (i > n ? 2 * n - i : i); j++) { 
     System.out.print(j); 
    } 
    System.out.println(); 
} 

Итеративный способ действительно прост, но я понятия не имею, как подойти к нему как к рекурсивному вызову.

Любые советы о том, как решить эту проблему?

EDIT: метод подписи фиксируется благодаря блоку тестирует

+0

Вы может создавать два рекурсивных метода: один для печати чисел в одной строке, второй - для рекурсивной печати первой и последней строк (в зависимости от ввода). – Pshemo

+0

Подсказка: вы хотите напечатать первую строку, вызвать подпрограмму, чтобы заполнить ее в середине, а затем распечатать последнюю строку. Затем подпрограмма становится точно такой же, как основной метод. – Ordous

+0

Это домашнее задание? – amphetamachine

ответ

4

Ваш код должен выглядеть следующим образом

public static void main(String[] args) { 
    recusiveFunction(1,10); // First parameter is the iteration number and 2 is total times. 
} 

private static void recusiveFunction(int iteration ,int total) { 
    String str=""; 
    for(int i=1;i<=iteration;i++){ // this loops creates what it needs to print 1 or 12 or 123 
     str+=i; 
    } 
    if(iteration<total/2){ 
     System.out.println(str); 
     recusiveFunction(++iteration,total); 
    } 
    System.out.println(str); 
} 

Выход:

1 
12 
123 
1234 
12345 
1234 
123 
12 
1 

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


Edit:

По словам pshemo изменил код немного, чтобы иметь абсолютно никаких Loops:

public static void main(String[] args) { 
    recusiveFunction(1,10,""); 
} 

private static void recusiveFunction(int iteration ,int total, String str) { 
    str+=iteration; 
    if(iteration<total/2){ 
     System.out.println(str); 
     recusiveFunction(++iteration,total,str); 
    } 
    System.out.println(str); 
} 

Выход:

1 
12 
123 
1234 
12345 
1234 
123 
12 
1 

Альтернативный путь :

public class Main { 
    private static int iteration=1; 
    private static String str =""; 

    public static void main(String[] args) { 
     printSequence(10); 
    } 

    private static void printSequence(int total) { 
     if(iteration<=total){ 
      str+=iteration; 
      System.out.println(str); 
      iteration++; 
      printSequence(total); 
     } 
     if(2*total - iteration >0) { 
      str = str.substring(0, 2 * total - iteration); 
      iteration++; 
      System.out.println(str); 
     } 
    } 
} 

Выход:

1 
12 
123 
1234 
12345 
123456 
1234567 
12345678 
123456789 
12345678910 
123456789 
12345678 
1234567 
123456 
12345 
1234 
123 
12 
1 
+0

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

+0

@Pshemo цикл предназначен только для построения строки, которую нужно отобразить. – StackFlowed

+0

Так что довольно легко переписать его как рекурсивный метод :) – Pshemo

1

Подсказка: Ваш главный рекурсивный метод может выглядеть

void recursiveMethod(int iter, int max){ 
    if iteration<max 
     print 1..iter 
     recursiveMethod(iter+1, max) 
     print 1..iter 
    else 
     print 1..iter 
} 

Вы можете написать дополнительный рекурсивный метод, который будет обрабатывать номера печати в диапазоне 1..n

 print 1..iter 
     recursiveMethod(iter+1, max) 
     print 1..iter 

должен обрабатывать печати

1 
.. 
1 

но будет также вызывать recursiveMethod(iter+1, max), которая заполнит .. часть с

12 
.. 
12 

и так далее, до тех пор случай, когда iteration==max, где нам нужно печатать только

123..max 
+0

это было бы так, как я бы это решил, но я не могу добавить параметр подписи метода из-за модульных тестов, которые проверяют мой код –

+1

@chamm Как я уже сказал в своем [предыдущем комментарии] (http: // stackoverflow .com/questions/26873488/convert-iterative-loop-to-recursive-method/26873864 # comment42305632_26873695), вы можете просто вызвать этот рекурсивный метод внутри метода с фиксированной подписью. Просто установите 'iter' в' 1' при запуске и пусть 'max' будет' n'. – Pshemo

+0

Другими словами, используйте 'private static void printSequence (int n) {recursiveMethod (1, n); } ' – Pshemo

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