标签:创建 size void cep pre class 技术分享 递归 长大
请画出下图:
我们可以考虑递归的做法。
当用户输入一个回型的边长时,我们通过程序输出一个相应边长的回型,当边长小于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:
标签:创建 size void cep pre class 技术分享 递归 长大
原文地址:http://www.cnblogs.com/liyuanba/p/2017-03-29.html