仅使用递归打印金字塔

时间:2016-11-26 00:37:20

标签: java recursion

我设法用这样的循环打印金字塔:

void printtree() {
  for (int i=0; i<row; i++){
    for (int j=0; j<row-i-1; j++)
      System.out.print(" ");
    for (int k=row; k>row-i-1; k--)
      System.out.print("* ");
    System.out.println();
  }
}

输出如下:

        * 
       * * 
      * * * 
     * * * * 
    * * * * * 
   * * * * * * 
  * * * * * * * 
 * * * * * * * * 
* * * * * * * * * 

我想只使用递归,我应该如何构造函数?我关心的是嵌套循环,我只能解释单个内部或外部循环。我知道它被(行1)空格所依据,然后是行##&#34; *&#34;在每一行上,然后更改为新行。这里的基本案例是什么?

2 个答案:

答案 0 :(得分:3)

因为您希望解决方案仅使用递归。我假设你不想在程序中有任何循环。如果您想快速将程序转换为递归方法,请查看每个for循环并思考如何转换它。

你可以转换

 for (int j=0; j<row-i-1; j++)
      System.out.print(" ");

运作

static void printSpace(int j, int i) {
        if (j < row - i - 1) {
            System.out.print(" ");
            printSpace(j + 1, i);
        }
    }

请注意,上面的递归函数与for循环相同。它需要您在for循环中使用的相同参数。现在这个技巧你可以应用于for循环打印星形。

static void printStar(int k, int i) {
        if (k > row - i - 1) {
            System.out.print("* ");
            printStar(k - 1, i);
        }
    }

类似的技巧可以应用于外部for循环,你可以转换代码。

完整代码

static int row = 5;

    static void printtree() {
        printPyramid(0);
    }

    static void printPyramid(int i) {
        printSpace(0, i);
        printStar(row, i);
        System.out.println();

        if (++i < row)
            printPyramid(i);
    }

    static void printSpace(int j, int i) {
        if (j < row - i - 1) {
            System.out.print(" ");
            printSpace(j + 1, i);
        }
    }

    static void printStar(int k, int i) {
        if (k > row - i - 1) {
            System.out.print("* ");
            printStar(k - 1, i);
        }
    } 

答案 1 :(得分:-1)

static void recursion(int row, int k, int j)
{
if(row>10)
{
    return;
}
else
{
    if(k==row)
    {
    System.out.println();
    recursion(++row, 0,0);
    }
    else if(10-j>row)
    {
    System.out.print(" ");
    ++j;
    recursion(row, k, j);
    }
    else
    {

    System.out.print("* ");
    recursion(row, ++k, j);
    }   
}
}

通话方法

recursion(0,0,0);