使用递归在Java中以正确格式打印菱形图案

使用递归在Java中以正确格式打印菱形图案,java,recursion,formatting,Java,Recursion,Formatting,我的程序从文件中读入值,并使用递归方法根据这些值打印星号图案。我只是在把所有东西都排好方面遇到了问题 输出应该如下所示: * * * * * * * * * * * * * * * * * * 关于输出的格式,说明如下: “请注意,图案围绕中心线对称(垂直)对齐。图案也应在每一条线上对称(水平)对齐-提示:使用“线”值来帮助留出空间。” 但我的输出如下所示: * * * * * * * * *

我的程序从文件中读入值,并使用递归方法根据这些值打印星号图案。我只是在把所有东西都排好方面遇到了问题

输出应该如下所示:

    *
  *   *
*   *   *
  *   *  
    *
*
*  *
*  *  *
*  *
*
关于输出的格式,说明如下:

“请注意,图案围绕中心线对称(垂直)对齐。图案也应在每一条线上对称(水平)对齐-提示:使用“线”值来帮助留出空间。”

但我的输出如下所示:

    *
  *   *
*   *   *
  *   *  
    *
*
*  *
*  *  *
*  *
*
我用来获取此模式的代码:

public static void makePattern(int thisRow, int num) {
    if(thisRow >= num) {
        for(int i = 0; i < num; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();

    }
    else {
        for(int i = 0; i < thisRow; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();

        makePattern(thisRow + 1, num);

        for(int i = 0; i < thisRow; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();
    }
}
import java.util.Scanner;
import java.io.*;

public class Program3 {
    public static void main(String[] args) throws Exception {
        int num = 0;
        int thisRow = 1;
        java.io.File file = new java.io.File("../instr/prog3.dat");
        Scanner fin = new Scanner(file);

        while(fin.hasNext()) {
                num = fin.nextInt();
                if(num >=0 && num <= 25)
                    makePattern(thisRow, num);
                System.out.println();
        } 
        fin.close();

    }
publicstaticvoidmakepattern(intthisrow,intnum){
如果(此行>=num){
for(int i=0;i
也是我的主要方法:

public static void makePattern(int thisRow, int num) {
    if(thisRow >= num) {
        for(int i = 0; i < num; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();

    }
    else {
        for(int i = 0; i < thisRow; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();

        makePattern(thisRow + 1, num);

        for(int i = 0; i < thisRow; i++) {
            System.out.print("  " + "*" + "  ");
        }
        System.out.println();
    }
}
import java.util.Scanner;
import java.io.*;

public class Program3 {
    public static void main(String[] args) throws Exception {
        int num = 0;
        int thisRow = 1;
        java.io.File file = new java.io.File("../instr/prog3.dat");
        Scanner fin = new Scanner(file);

        while(fin.hasNext()) {
                num = fin.nextInt();
                if(num >=0 && num <= 25)
                    makePattern(thisRow, num);
                System.out.println();
        } 
        fin.close();

    }
import java.util.Scanner;
导入java.io.*;
公共课程3{
公共静态void main(字符串[]args)引发异常{
int num=0;
int thisRow=1;
java.io.File File=new java.io.File(“../instr/prog3.dat”);
扫描仪fin=新扫描仪(文件);
while(fin.hasNext()){
num=fin.nextInt();
如果(num>=0&&num,让我们先分析输出!!
第一步是分析输出

结论:
  • 每行上的字符总数始终为n(=3)
  • 空间数具有以下模式:

    第1行3-1空格
    第二行3-2空格
    第三行3-3个空格
    第四行4-3个空格
    第五行5-3个空格

    所以

  • 递归应在第6行结束,即当前行号为n*2

    因此递归方法中的返回条件应该是

    if(thisRow == num * 2) 
       return;
    


最后一个代码:把PEICE放在一起 当我们把PEICE放在一起时,我们得到:

    public static void makePattern(int thisRow, int num) { 
        //the termination condition
        if(thisRow == num * 2) 
           return;

        //the number of spaces
        int numberOfSpaces = 0;     
        if(num < thisRow) {
          numberOfSpaces = thisRow - num;
        } else {
          numberOfSpaces = num - thisRow;
        }

        //the number of stars
        int numberOfStars = num - numberOfSpaces;

        //compose the string before printing it
        StringBuffer outputBuffer = new StringBuffer(num);
        for (int i = 0; i < numberOfSpaces; i++){
            outputBuffer.append(" ");
        }
        for (int i = 0; i < numberOfStars; i++){
            outputBuffer.append("* ");
        }

        //print the string
        System.out.println(outputBuffer.toString());

        //recursion
        makePattern(thisRow + 1, num);
   }
publicstaticvoidmakepattern(intthisrow,intnum){
//终止条件
如果(thisRow==num*2)
回来
//空间数
int numberOfSpaces=0;
如果(num<此行){
numberOfSpaces=thisRow-num;
}否则{
numberOfSpaces=num-此行;
}
//星星的数目
int numberOfStars=num-numberOfSpaces;
//在打印之前先合成字符串
StringBuffer outputBuffer=新的StringBuffer(num);
for(int i=0;i
让我们先分析输出!! 第一步是分析输出

结论:
  • 每行上的字符总数始终为n(=3)
  • 空间数具有以下模式:

    第1行3-1空格
    第二行3-2空格
    第三行3-3个空格
    第四行4-3个空格
    第五行5-3个空格

    所以

  • 递归应在第6行结束,即当前行号为n*2

    因此递归方法中的返回条件应该是

    if(thisRow == num * 2) 
       return;
    


最后一个代码:把PEICE放在一起 当我们把PEICE放在一起时,我们得到:

    public static void makePattern(int thisRow, int num) { 
        //the termination condition
        if(thisRow == num * 2) 
           return;

        //the number of spaces
        int numberOfSpaces = 0;     
        if(num < thisRow) {
          numberOfSpaces = thisRow - num;
        } else {
          numberOfSpaces = num - thisRow;
        }

        //the number of stars
        int numberOfStars = num - numberOfSpaces;

        //compose the string before printing it
        StringBuffer outputBuffer = new StringBuffer(num);
        for (int i = 0; i < numberOfSpaces; i++){
            outputBuffer.append(" ");
        }
        for (int i = 0; i < numberOfStars; i++){
            outputBuffer.append("* ");
        }

        //print the string
        System.out.println(outputBuffer.toString());

        //recursion
        makePattern(thisRow + 1, num);
   }
publicstaticvoidmakepattern(intthisrow,intnum){
//终止条件
如果(thisRow==num*2)
回来
//空间数
int numberOfSpaces=0;
如果(num<此行){
numberOfSpaces=thisRow-num;
}否则{
numberOfSpaces=num-此行;
}
//星星的数目
int numberOfStars=num-numberOfSpaces;
//在打印之前先合成字符串
StringBuffer outputBuffer=新的StringBuffer(num);
for(int i=0;i
这是使用递归技术打印菱形图案的代码

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
    public class patternRecursion {
    static int n,k;
    public static void main(String[] args) throws IOException{
        try(Scanner s = new Scanner(System.in)){

            n=Integer.parseInt(reader.readLine());
            k=n-1;
            printPattern(n);
        }
    }
    public static void printChar(int m,char c){
        if(m==0) return;
        try{
            printChar(m-1,c);
            System.out.print(c);

        }catch(StackOverflowError s){return;}

    }
    public static void printPattern(int m){
        if(m==0){
            return ;
        }else{

        printChar(m-1,' ');
        printChar(n-m,'#');
        printChar(n-m+1,'#');
           System.out.println();
           printPattern(m-1);
         printChar(m,' ');
         printChar(k-m,'#');
         printChar(k-m+1,'#');
            System.out.println();
         }

    }

}这是使用递归技术打印菱形图案的代码

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
    public class patternRecursion {
    static int n,k;
    public static void main(String[] args) throws IOException{
        try(Scanner s = new Scanner(System.in)){

            n=Integer.parseInt(reader.readLine());
            k=n-1;
            printPattern(n);
        }
    }
    public static void printChar(int m,char c){
        if(m==0) return;
        try{
            printChar(m-1,c);
            System.out.print(c);

        }catch(StackOverflowError s){return;}

    }
    public static void printPattern(int m){
        if(m==0){
            return ;
        }else{

        printChar(m-1,' ');
        printChar(n-m,'#');
        printChar(n-m+1,'#');
           System.out.println();
           printPattern(m-1);
         printChar(m,' ');
         printChar(k-m,'#');
         printChar(k-m+1,'#');
            System.out.println();
         }

    }

}

能否显示
主(字符串[])
method?是的,我在原始问题中添加了它。首先,始终关闭外部资源。其次;为什么,如果您正在读取文件,您会
System.out.print
请求数据?最后,文件如何解释您想要菱形而不是三角形?文件中是否指定了空格?哦,您是对的,我很复杂我忘了关闭文件,谢谢你提醒我。出于某种原因,我认为我们的教授说我们需要提示输入,我错了,实际上已经删除了代码的那部分。我将在一秒钟内更新,因为我也改变了while循环的一点点。文件并没有真正解释它,钻石只是一个PAR。因为我们教授喜欢做电动汽车,所以他没有遵守他的指示