2013-02-24 88 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(">"); 
    } 
}