2013-02-24 60 views
0

作业:寻找更好的策略或方法而不是完整的代码。Java:递归方法接受整数'n'并打印'n'字符

当我试图确定这个问题的递归情况时,我感到绝对困惑。我必须编写一个接受整数参数'n'然后打印总共'n'个字符的方法。取决于原始整数是奇数还是偶数,中间字符应始终为''或' *'。以下是几种不同的方法调用和输出应该如下所示:

writeChars(1) -> * 
writeChars(2) -> ** 
writeChars(3) -> <*> 
writeChars(4) -> <**> 
writeChars(5) -> <<*>> 
writeChars(6) -> <<**>> 
writeChars(7) -> <<<*>>> 
writeChars(8) -> <<<**>>> 

我该如何去尝试确定递归情况?

回答

2

你有两个基本情况:n == 1和n == 2.除此之外,递归规则是发出一个“<”,用n-2递归(考虑到你要去的两个字符在此级别发射),然后发射“>”。

+0

这太简单了。我需要做更多的这些来开始识别模式。 – 2013-02-24 06:04:52

+0

@PatK - 诀窍是寻找自相似模式何时开始出现,以及重复模式的长度。在这种情况下,周期是一个长周期,从n = 3开始。 (每个n> 2与n-2完全一样,除了一对额外的“<>”对。对不起,太简单了:) – 2013-02-24 06:09:52

1

为了识别递归,首先考虑如何针对给定的n值解决问题,假设您有一种方法可以解决小问题。大小为n的解决方案如何与大小为n-1的解决方案相关?

之后,你会发现一个或多个你无法解决的小案例。那些是你的基本情况。

最后,写一个方法,直接做每个基本情况。对于大于基本情况的n,它会自行调用n-1,然后修改该结果以获得大小为n的解。

0

我可能会devide问题成3个部分 1.打印< 2.打印* 3.打印>

在此基础上,我们可以创建一个递归解决方案来打印每一个组件。 <>的数量基于公式i % 2 == 1 ? i/2 : (i - 2)/2,那么我们可以编写一个函数来递归地打印它们,然后再打印它们以打印*

public class SO15049082 { 

    public static void main(String[] args) { 
     for (int i = 0; i < 10; i++) { 
      print(i); 
     } 
    } 

    private static void print(int i) { 
     if (i > 0) { 
      System.out.print("writeChars(" + i + ") --> "); 
      int c = i % 2 == 1 ? i/2 : (i - 2)/2; 
      printleft(c); 
      printstar(c % 2); 
      printright(c); 
     } 
     System.out.println(); 
    } 

    private static void printright(int i) { 
     if (i > 0) { 
      System.out.print(">"); 
      printright(i - 1); 
     } 
    } 

    private static void printstar(int i) { 
     if (i == 1) { 
      System.out.print("*"); 
     } else { 
      System.out.print("**"); 
     } 
    } 

    private static void printleft(int i) { 
     if (i > 0) { 
      System.out.print("<"); 
      printleft(i - 1); 
     } 
    } 

} 
0

我想过递归的方式是通过两种状态(位置,字符串:S)在每个递归调用,变化和三种状态(N,MID1,MID2)在就如何实现的决定,帮助下一个状态。

public static void main(String... arg) { 
     int n = 10, mid1, mid2; 
     if (n % 2 == 0) { 
      mid1 = n/2; 
      mid2 = n/2 + 1; 
     } else { 
      mid1 = mid2 = n/2 + 1; 
     } 

     System.out.println(recursion(1, n, mid1, mid2, "")); 
    } 

    private static String recursion(int pos, final int n, final int mid1, final int mid2, String s) { 
     if (pos > n) 
      return s; 
     else if (pos == mid1 || pos == mid2) 
      return recursion(pos + 1, n, mid1, mid2, s + "*"); 
     else if (pos < mid1) 
      return recursion(pos + 1, n, mid1, mid2, s + "<"); 
     else 
      return recursion(pos + 1, n, mid1, mid2, s + ">"); 
    } 
0

我只是假设两个基本情况,一个是当n是偶数时,另一个是当n是奇数时。

现在在递归调用中,我传递n - 2;在奇数n的情况下,其结束为1,并且对于偶数n,结束为2.

public static void writeChars(int n) { 
    if(n < 1)  
     throw new IllegalArgumentException(); 
         
    if(n == 1)   //odd base case 
        System.out.print("*"); 

    else if(n == 2)  //even base case 
        System.out.print("**"); 
         
    else {    //recursive case 
        System.out.print("<"); 
        writeChars(n - 2); 
        System.out.print(">"); 
    } 
}