2014-10-31 2 views
0

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

This was written by call number 2. 
This was written by call number 3. 
    This was written by call number 4. 
    This ALSO written by call number 4. 
    This ALSO written by call number 3. 
This ALSO written by call number 2. 
This ALSO written by call number 1. 

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

Это мой текущий выход.

This was written by call number 2. 
This was written by call number 3. 
This was written by call number 4. 
This ALSO written by call number 1. 
    This ALSO written by call number 2. 
    This ALSO written by call number 3. 
    This ALSO written by call number 4. 

Там нет разноса реализован в цикл пока б/с Я не уверен, если эта часть также должна быть рекурсивными.

Моего код:

public class Recursion { 

    public static void main(String[] args) { 
    for (int i = 2; i < 5; i++) { 
     System.out.println("This was written by call number " + i + "."); 
    } 
    recurse(4); 
    } 

    public static void recurse(int n) { 
    String temp = ""; 

    for (int i = 0; i < n; i++) { 
     temp += " "; 
    } 

    if (n < 2) { 
     System.out.println("This ALSO written by call number " + n + "."); 
    } 
    else { 
     recurse(n - 1); 
     System.out.println(temp + "This ALSO written by call number " + n + "."); 
    } 
} 
+0

Чтобы облегчить это, я бы рекомендовал использовать 2 отличительные функции. Один печатает линию после рекурсивного вызова, другой печатает ее до. – bestsss

+0

@MichaelJames Нет, нет необходимости использовать 2 функции. Я нахожусь в середине написания ответа ... – ajb

+0

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

ответ

1

простое решение.

public static void main(String[] args) { 
    recurse(1); 
} 

public static void recurse (int n) { 
    if (n==5) return; 
    String temp=""; 
    for (int i=0;i<n;i++) temp += " "; 
    if (n!=1) { 
    System.out.println(temp + "This was written by call number " + n + "."); 
    } 
    recurse(n+1); 
    temp=" "; 
    for (int i=0;i<n;i++) temp += " "; 
    System.out.println(temp + "This ALSO was written by call number " + n + "."); 
} 
1

Ключ к написанию большинства рекурсивных программ (особенно те, что вы, как данные задания), чтобы посмотреть на более серьезную проблему, которая содержит подобное, но меньше возникновения тех же проблем ,

В вашем случае «большая проблема» заключается в том, чтобы напечатать 6 строк, которые начинаются и заканчиваются «номером вызова 2». То есть, печатайте строки для номеров вызовов с 2 по 4. Способ сделать это: напечатать первую строку, которая говорит «номер вызова 2», решить проблему, чтобы напечатать 4 строки для номеров вызовов с 3 по 4 и распечатать последняя строка, которая говорит «номер вызова 2». Часть в середине - это меньшее возникновение той же проблемы. Это будет рекурсивный звонок.

Поскольку ваша большая проблема начнется с «номера вызова 2», а ваша меньшая проблема начнется с номера звонка, который будет выше, я бы рекомендовал организовать так, чтобы вы звонили recurse(n+1) вместо recurse(n-1). Если вы это сделаете, вам понадобится второй параметр, чтобы вы знали, когда прекратить рекурсию - что-то вроде recurse(n+1, last).

Надеюсь, этого будет достаточно, чтобы заставить вас думать о правильном пути.

+0

Я подумал о необходимости «отменить рекурсию», используя «n + 1», но я получил переполнение стека b/c, у него не было второго параметра. Благодарю. Я посмотрю, что я могу придумать. Однако, просто для разъяснения, могу ли я напечатать первую часть рекурсивно: «Это было написано номером вызова n', или я должен просто использовать цикл for для этого, как я сейчас ? Редактирование: вы сказали «шесть строк», поэтому я предполагаю, что могу делать все, что они просят без петли for. У меня возникли проблемы с пониманием того, как я поставил бы ТАКЖЕ, используя только одну функцию. –

+0

@MichaelJames «Большая проблема» для вызова номера 2 - 6 строк; меньшая проблема - 4 строки. Это означает, что ваша функция для вызова номера 2 будет печатать как первую, так и последнюю строку с рекурсией между ними. Я думаю, если вы подумаете об этом, вы поймете ответ на свой последний вопрос. – ajb

+0

AH !! Я так не думал об этом! Благодарю. –

1

Попробуйте это:

public static void main(String[] args) { 
    recurse(1, true, 1); 
} 

public static void recurse(int n, boolean loop, int add) { 
    String temp = ""; 
    String out = ""; 

    for (int i = 0; i < n; i++) { 
     temp += " "; 
    } 

    if (add > 0) { 
     out = temp + "This was written by call number "; 
    } else { 
     out = temp + "This ALSO written by call number "; 
    } 

    if (n == 1 && !loop) { 
     System.out.println(out + n + "."); 
     return; 
    } else if (n == 1) { 
     recurse(n+add, false, add); 
    } else if (n == 5) { 
     add = add - 2 * add; 
     recurse(n+add, false, add); 
    } else { 
     System.out.println(out + n + "."); 
     recurse(n+add, false, add); 
    } 
} 
+0

решение должно быть намного проще – bestsss

+0

Здесь уже поздно. :) –

+0

Судя по вашему имени, было бы 00:57, что не так поздно, то есть я верю, что живу к востоку от вашего местоположения. – bestsss

1

Это довольно простое решение. Также обратите внимание, как вы можете легко получить строку отступа (через подстроку). Рекурсия такая же простая, как и она: напечатайте номер, введите функцию с большим числом, если она ниже max, а затем вернитесь назад.

class R{ 
     static final String spaces="         "; 
     public static void main(String[] args) { 
     rec3(1,4); 
     } 
     private static void rec3(int i, int max) { 
     if (i>1) System.out.printf("%sThis was written by call number: %d%n", spaces.substring(0, i-1), i); 
     if (i<max) rec3(i+1, max); 
     System.out.printf("%sThis was ALSO written by call number: %d%n", spaces.substring(0, i-1), i);  
     } 
    } 
0

Спасибо всем за помощь. Я немного изменил решение от @JoseLuis.

public class Recursion { 

    public static void main(String[] args) { 
    recurse(1, 5); 
    } 

    public static void recurse(int n, int max) { 
    String temp = ""; 
    for (int i = 0; i < n; i++) { 
     temp += " "; 
    } 
    if (n == max) { 
     return; 
    } 
    if (n != 1) { 
     System.out.println(temp + "This was written by call number " + n + "."); 
    } 
    recurse(n + 1, max); 
    System.out.println(temp + "This ALSO was written by call number " + n + "."); 
    } 
} 
Смежные вопросы