Java Recursion General Concept

时间:2015-05-01 04:11:04

标签: java recursion

这是java中的一个简单的递归问题。这个我一直在努力,但需要改进我的方法。

使用两个int参数m和n编写递归方法。前提条件要求0 <= m且m <= n。该方法打印一行m个星号,然后打印一行m + 1个星号,依此类推,直到一行n个星号。然后向后重复相同的模式:一行n个星号,然后是n-1,依此类推,直到n。实现中允许的唯一循环是打印一行m星号的循环。

这就是我所拥有的测试方法

package Recursion;

class Asterisk 
{
       public static void asterisk(int m, int n) 
       {
          if (m == n) 
          {
             printAsterisk(n);
             return;
          } 
          else if (m < n) 
          {
              printAsterisk(m);
              asterisk(m + 1, n);
          } 
          else 
          {
              printAsterisk(m);
              asterisk(m - 1, m);
          }
       }

      public static void printAsterisk(int m) 
      {
          for (int i = 0; i < m; i++) 
          {
              System.out.print("*");
          }
              System.out.println("");
      }

      public static void main(String[] args) 
      {
          int m = 3;
          int n = 5;

          asterisk(m, n);
          asterisk(n, m);
      }

}

3 个答案:

答案 0 :(得分:1)

所以,你需要这个:

printAsterisk(3, 5)
***
****
*****
*****
****
***

这样想:printAsterisk(6, 5)什么都不打印。 printAsterisk(3, 5)打印3个星号,然后插入printAsterisk(4, 5),然后再次打印3个星号。

答案 1 :(得分:0)

以下代码可以使用:

class Test {

    public static void asterisk(int m, int n) {
        if (m == n) {
            printAsterisk(m);
            return;
        } else if (m < n) {
            printAsterisk(m);
            asterisk(m + 1, n);
        } else {
            printAsterisk(m);
            asterisk(m - 1, n);
        }
    }

    public static void printAsterisk(int m) {
        for (int i = 0; i < m; i++) {
            System.out.print("*");
        }
        System.out.println("");
    }

    public static void main(String[] args) {
        int m = 3;
        int n = 5;
        asterisk(m, n);
        asterisk(n, m);
    }

}

请注意,这不是正确的方法。由于这个问题感觉像是一个任务,我不会发布准确的版本。现在,您的任务是将main方法中的两个调用移除到asterisk,并修改该方法以使用单个调用。

答案 2 :(得分:0)

您的方法很好,您只需要考虑进入printAsterisk(int m, int n)的内容。

递归函数通常可以被认为是解决可重复问题的一小部分,然后使用不同的参数将问题的其余部分委托给自己。

考虑以下输出(printAsterisk(4, 4);):

****

如果我们想获得以下输出(printAsterisk(3, 4);):

***
****
***

很容易看到此输出包含中间printAsterisk(4, 4);的输出,因此当您调用printAsterisk(3, 4);时,它应打印3个星号,调用printAsterisk(4,4);然后打印剩余的3个星号。

如果你进一步扩展这个实现应该很容易看到。