Печать формы V с использованием только рекурсии - PullRequest
0 голосов
/ 14 марта 2020

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

Вот мой код:

  public class Pattern {

    public static void main(String[] args) {
         printPattern(5);
    }
       public static void Pattern(int count, String s) {
        if (count == 0) {
            return;
        }

        System.out.print(s);
        Pattern(count - 1, s);
    }

    public static void upperhalf(int count, int max) {
        if (count == 0) {
            return;
        }

        Pattern(max - count, " ");
        Pattern(count, "* ");

        System.out.println();

        upperhalf(count - 1, max);
    }



    public static void printPattern(int n) {
        upperhalf(n, n);

    }
}

Вывод:

 * * * * * 
  * * * * 
   * * * 
    * * 
     * 

Вывод, который я хочу:

  *       *
   *     *
    *   *
     * *
      *

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Один из способов ее решения. Замените ваши два последовательных вызова Pattern следующим:

    Pattern(max - count, " ");
    Pattern(1, "* ");
    Pattern(count - 2, "  ");
    Pattern(1, count > 1 ? "* " : "");        

(Ie ваш первый вызов Pattern, затем явный для одного *, затем несколько пробелов (на 2 меньше, чем в вашем подходе), затем last *).

Вам также необходимо немного изменить инструкцию выхода:

public static void Pattern(int count, String s) {
    if (count <= 0) { // <= instead of ==
        return;
    }
0 голосов
/ 14 марта 2020

Если вам интересно, вот один из способов сделать это, используя последовательные подстроки. Вот некоторые ключевые моменты.

  • Начальный размер изменен, чтобы обеспечить его нечетность. Это гарантирует, что V будет равномерным.
  • Переданная строка состоит из пробела, за которым следует звездочка. Левая звездочка задается рекурсивным методом.
  • Отступ используется для правильного позиционирования начала оставшейся строки.
        int size = 10;
        String v = " ".repeat((size | 1) - 2) + "*";
        V(v,0);


       public static void V(String v, int indent) {
           System.out.println(" ".repeat(indent)+ "*" + v);
           if (v.isEmpty()) {
               return;
           }
           V(v.substring(2),indent+1);
       }
...