2015-05-01 161 views
0

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

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

这是我到目前为止的测试方法

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); 
     } 

}

+0

他在询问有关实施递归的帮助。循环显然是任务允许他拥有的循环。 – Raniz

回答

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); 
    } 

} 

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

+0

这看起来像一个学生作业。尽量避免给学生代码,并优先解释和提示超过明显的解决方案。 – Amadan

+0

更不用说这是错的。 – jaket

+0

@Amadan:这不是一个准确的答案,我试图引导OP来提出一个准确的递归。 – Bhoot

1

所以,你需要这样的:

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

认为它是这样的:printAsterisk(6, 5)打印什么。 printAsterisk(3, 5)打印3星号,然后插入printAsterisk(4, 5),然后再打印3星号。

0

你的方法很好,你只需要考虑进入printAsterisk(int m, int n)会发生什么。

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

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

**** 

如果我们希望得到下面的输出(printAsterisk(3, 4);):

*** 
**** 
*** 

很容易看出,这个输出包含输出printAsterisk(4, 4);,所以当你打电话给printAsterisk(3, 4);时,它应该打印3个星号,呼叫printAsterisk(4,4);,然后打印剩下的3个星号。

如果您进一步扩展此实现应该很容易看到。