回型嵌套

回型嵌套

请画出下图:

我们可以考虑递归的做法。

当用户输入一个回型的边长时,我们通过程序输出一个相应边长的回型,当边长小于5时,输出的回型只有一层,当边长大于等于5时,输出的回型就是多层的。

编程思路如下:

先创建一个与回型边长等宽的二维数组,先画最外围的回型,它的起始位置为(0,0),长度为输入的边长,该回型是由两条横线,两条竖线组成,分别画出这四条线即可,而画横线与竖线很简单,只要把数组中的这些位置替换成*就可以了,最外围画完后就可以画中间位置的回型,仔细观察上述图形,会发现最外围的回型与和他相邻的回型的起始位置相差2,边长相差4,其他都一样,一次类推,起始位置每次加2,而边长每次减4,直到边长为零结束。

程序如下:

//2017.03.29 by 迷糊狐狸
import java.util.Scanner;

public class MyWork {
    
    //开一个与回型边长等宽的数组,也可以适当大一些
    static void h(int n){
        char[][] cc = new char[n][n];
        h(cc,0,0,n);
        show(cc);
    }
    
    //分别画出回型的四条边
    static void h(char[][] cc, int x, int y, int n){
        //递归结束条件
        if(n<=0)return;
        
        draw_x(cc,x,y,n);
        draw_x(cc,x,y+n-1,n);
        draw_y(cc,x,y,n);
        draw_y(cc,x+n-1,y,n);
        
        h(cc,x+2,y+2,n-4);
    }
    
    //画横线,注意x、y不要写反了
    //长宽相等的时候写反了不影响结果
    //当长宽不相等时会超出数组的范围
    static void draw_x(char[][] cc, int x, int y, int len){
        for(int i=0; i<len; i++)cc[y][x+i] = '*';
    }
    
    static void draw_y(char[][] cc, int x, int y, int len){
        for(int i=0; i<len; i++)cc[y+i][x] = '*';
    }
    
    //显示数组
    static void show(char[][] cc){
        for(int i=0; i<cc.length; i++){
            for(int j=0; j<cc[i].length; j++){
                System.out.print(cc[i][j]==0? ' ' : cc[i][j]);
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入回形边长:");
        while(true){
            try{
                int n = Integer.parseInt(scan.nextLine().trim());
                if(n<=0)throw new Exception();
                h(n);
                break;
            }catch(Exception e){
                System.out.println("输入有误!");
                System.out.print("请重新输入:");
            }
        }
    }
}

 运行结果如下:

示例1:

示例2:

示例3:

示例4:

原文地址:https://www.cnblogs.com/liyuanba/p/2017-03-29.html