陷入Java中的递归模式(ZigZag)

时间:2013-08-19 16:00:26

标签: java

语言:Java

我遇到了一个应该产生以下模式的递归方法的问题:

Zigzag 1
*

Zigzag 2
*
**
 *

Zigzag 3
*
***
 *

Zigzag 4
*
**
 *
****
  *
  **
   *

Zigzag 6
*
***
 *
******
   *
   ***
    *

Zigzag 8
*
**
 *
****
  *
  **
   *
********
    *
    **
     *
    ****
      *
      **
       *

这是我到目前为止所做的:

public void printZigZag(int size, int indent) {
    if(size > 0 && indent >= 0){
        String temp = "";

        for(int i = 0; i < indent; i++){
            temp += " ";
        }
        for(int i = 0; i < size; i++){
            temp += "*";
        }


        printZigZag(size/2, indent);

        /* Example of something I've tried...
                    if(size != 1){
            indent++;
        }

        if(size % 2 != 0){
            indent = temp.length() - 2;
        } else {
            indent = temp.length() / 2;
        }
        */

        System.out.println(temp);
        printZigZag(size/2, ++indent);
    }
}

但是那段代码产生了这个(Zigzag#的大小):

Zigzag 1
*

ZigZag 2
*
**
 *

ZigZag 3
*
***
 *

ZigZag 4
*
**
 *
****
 *
 **
  *

ZigZag 6
*
***
 *
******
 *
 ***
  *

ZigZag 8
*
**
 *
****
 *
 **
  *
********
 *
 **
  *
 ****
  *
  **
   *

我已经做了几天了,有各种不同的if和语句顺序,无法弄清楚我哪里出错了。

非常感谢任何帮助,请提前感谢。

PS。抱歉这个巨大的帖子。

2 个答案:

答案 0 :(得分:2)

看起来递归模式是:

zigZag(1): print *
zigZag(n): zigZag(n / 2), print n times *, zigZag(n / 2)

请注意缩进因素。试试这个:

public class ZigZag {
    public static void main(String[] args) {
        int n = 4;

        zigZag(n, 0);
    }

    public static void zigZag(int n, int i /* indentation factor */) {
        if(n > 1)
            zigZag(n / 2, i);

        for(int k = i; k > 0; k--)
            System.out.print(" ");

        for(int k = n; k > 0; k--)
            System.out.print("*");

        System.out.println();

        if(n > 1)
            zigZag(n / 2, i + n / 2);
    }
}

答案 1 :(得分:1)

我希望你不介意,我无法抗拒:)这是它在JS中实现的。

function zigzag(n, pad) {
  if(n > 0) {
    zigzag(~~(n / 2), pad);
    console.log(Array(pad+1).join(" ") + Array(n+1).join("*"));
    zigzag(~~(n / 2), pad+~~(n / 2)); //~~ implicitily coerces floats to whole numbers
  }
}

zigzag(1, 0);
zigzag(2, 0);
zigzag(3, 0);
zigzag(4, 0);