用递归算法画出该图形,递归方法的参数为left和right,第一次进入该程序时,left为0,right为宽度减1,即为15。
我想用数组来保存该图形,请哪位大哥指点如何实现
--------x-------
----x-------x---
--x---x---x---x-
-x-x-x-x-x-x-x-x
xxxxxxxxxxxxxxxx

解决方案 »

  1.   

    给各非递归的算法吧:
    public class MapCreator{
        public static void print(int left,int right){
            int len =right-left+1;
            int time =1;
            while(len>0){
                for(int n=0;n<time;n++){
                    int i =1;
                    for(;i<len/2+1;i++) System.out.print("-");
                    System.out.print("x");
                    for(;i<len;i++) System.out.print("-");
                }
                len /=2;
                time *=2;
                System.out.println();
            }
        }
        public static void main(String[] args){
            print(0,15);
        }
    }
      

  2.   

    第二行不合规律啊(例外情况?)看半天没整出规律来,给个近似的:
    public static StringBuffer func(int left, int right){
    StringBuffer sb = new StringBuffer();
    int n = (int)Math.pow(2, left);
    int step = (int)Math.pow(2, (int)(Math.log(right)/Math.log(2)-left));
    if(n > right)
    return sb;
    for(int i=0;i<=right;i++){
    if(step == 1 || (i>0 && i % step ==0)){
    sb.append('x');
    } else {
    sb.append('-');
    }
    }
    sb.append('\n');
    sb.append(func(left+1, right));
    return sb;
    }String result[] = func(0,15).toString().split("\\n");
      

  3.   

    谢谢flushtime(),你的方法不错。
    我想知道这个怎么递归,有哪位能给出递归的算法?
      

  4.   

    left和right为递归方法的参数,即左右边界,因为用数组,所以为(0,15),对于第二排的为(0,8),(8,15)等等
      

  5.   

    为了简单起见,增加了一个参数 int layer,用来表示给那一行赋值。
    其实根据left和right可以推算出来它的值,但是楼主的分给得比较少,只好留给楼主做啦,哈哈!public class TestDraw {

    private char[][] result = {
    {'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
    {'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
    {'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
    {'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
    {'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'}
    };

    /**
     * @param args
     */
    public static void main(String[] args) {
    TestDraw td = new TestDraw();

    td.draw(0,15,0);

    for (int i=0; i<td.result.length; i++) {
    System.out.println(td.result[i]);
    }
    }

    private void draw(float left, float right, int layer) {
    if (layer >= result.length) {
    result[layer-1][0] = 'x';
    return;
    } else {
    result[layer][Math.round((left+right)/2)] = 'x';
    draw(left,Math.round((left+right)/2),layer+1);
    draw(Math.round((left+right)/2),right,layer+1);
    }
    }
    }
      

  6.   

    wdman(只提供解决方案,代码另外收分!) 我没注意分给少了,我是默认给分的
    其实就是在两个参数的情况下,我不能很好的确定它的行数
      

  7.   

    楼上的wdman朋友水平很高啊,佩服!
    我想了很久才搞定,跟wdman朋友的差别不大:
    package src;
    /*
     * 用递归算法画出该图形,递归方法的参数为left和right,第一次进入该程序时,left为0,right为宽度减1,即为15。
     * 
    --------x-------
    ----x-------x---
    --x---x---x---x-
    -x-x-x-x-x-x-x-x
    xxxxxxxxxxxxxxxx
     */
    public class Mymethod3 {
    public static Integer layer=0,left=0,right=15;
    public static char[][] str;
    public static void rPrint(int l,int r,int t){
    if(t>=layer)
    str[t-1][0]='x';
    else{
    str[t][(l+r+1)/2]='x';
    rPrint(l,(l+r+1)/2,t+1);
    rPrint((l+r+1)/2,r,t+1);
    }
    }
    public static int nLayer(int m){
    int temp=0;
    while(m!=0){
    m=m/2;
    ++temp;
    }
    return temp;
    }
    public static void main(String[] agrs){
    layer=nLayer(left+right)+1;
    str=new char[layer][right+1];
    for(int i=0;i<layer;i++)
    for(int j=0;j<=right;j++)
    str[i][j]='-';
    rPrint(left,right,0);
    for(int i=0;i<layer;i++){
    System.out.print(str[i]);
    System.out.print("\n");
    }
    }
    }
      

  8.   

    private int getLayer(float left,float right) {
    if ((right == (result[0].length-1)) && (left != (result[0].length-1))) {
    right++;
    }
    int diff = (int)(right - left);
    int pow = result.length;
    while (diff > 0) {
    diff /= 2;
    pow--;
    }
    return pow;
    }

    private void draw(float left, float right) {
    int layer = getLayer(left,right);

    if (layer >= (result.length-1)) {
    result[layer][0] = 'x';
    result[layer][result[0].length-1] = 'x';
    }

    result[layer][Math.round((left+right)/2)] = 'x';

    if ((right - left) > 1) {
    draw(left,Math.round((left+right)/2));
    draw(Math.round((left+right)/2),right);
    }
    }