2014-11-09 26 views
1

如果任何人熟悉PracticeIt,那就是我正在做的事情,而且我在遞歸問題集上。我在做這些事情時遇到了麻煩。這裏有一個問題:在java中使用遞歸從單個int參數獲取各種輸出

寫接受的整數參數n並打印由逗號分隔的第一n正方形,與按降序排列,接着以升序甚至正方形奇數平方的方法writeSquares。下表列出了幾個電話的方法和他們的預期輸出:

writeSquares(5); ----> Output: 25, 9, 1, 4, 16 
    writeSquares(1); ----> Output: 1 

我每天花幾個小時過去3天內搞清楚遞歸,但我就是想不通。 任何人都可以指向正確的方向嗎?

我的代碼如下所示:

public static void writeSquares(int n) 
{ 
    if(n<1) 
     throw new IllegalArgumentException(); 
    else{ 
     if(n%2==0){ 
      System.out.print((n-1)*(n-1)); 
      writeSquares2(n-1, n-1, "down"); 
     } 
     else{ 
      System.out.print(n*n); 
      writeSquares2(n-1, n-1, "down"); 
     } 
    } 
} 

public static void writeSquares2(int n, int m, String s) 
{ 
    if(m==0){ 
     return; 
    } 

    String ss = s; 

    if(n<=1){ 
     ss = "up";} 

    if(n%2==1&&s=="down"){ 
     System.out.print(", " + n*n); 
     writeSquares2(n-2,m-1,ss); 
    } 
    if(n%2==0&&s=="down"){ 
     writeSquares2(n-1,m-1,ss); 
     System.out.print(", " + n*n); 
    } 
    if(n%2==1&&s=="up"){ 
     System.out.print(", " + n*n); 
     writeSquares2(n+2,m-1,ss); 
    } 
    if(n%2==0&&s=="up"){ 
     writeSquares2(n+1,m-1,ss); 
     System.out.print(", " + n*n); 
    } 

編輯:Woops我固定下面

的代碼和設置其他問題的另一個問題是:

編寫接受一個整數的方法writeSequencen作爲一個參數,並打印一個對稱序列n數字以降序整數結尾1後跟升序整數乞求局以1,如下表所示:

writeSequence(9);  -----> 5 4 3 2 1 2 3 4 5 
    writeSequence(10); -----> 5 4 3 2 1 1 2 3 4 5 

我的代碼:

public void writeSequence(int n) 
{ 
    if(n<1) 
     throw new IllegalArgumentException(); 
    else 
     writeSequence2(n, n, "down"); //I actually dont need the second parameter 
} 

    public void writeSequence2(int n, int m, String s) 
    { 
     String ss = s; 
     if(n/2-1==1) 
      ss = "up"; 

     if(n==1) 
      System.out.print(n); 


     else if(ss.equals("down")){ 
      if(n%2==0){ 
       System.out.print(n/2+" "); 
       writeSequence2(n-1, m-1, ss); 
      } 
      else if(n%2==1){ 
       writeSequence2(n-1, m-1, ss); 
       System.out.print(" "+ (n/2+1)); 
      } 

     } 

     else if(ss.equals("up")){ 
      if(n%2==0){ 
       System.out.print(n/2+" "); 
       writeSequence2(n-1, m-1, ss); 
      } 
      else if(n%2==1){ 
       writeSequence2(n-1, m-1, ss); 
       System.out.print(" " + (n/2+1)); 
      } 
     } 
    } 

對於第二個,我的代碼是有些正確的。除了n單數。 另外一個問題 - 是否可以用單一方法做到這些?

謝謝你的時間。我學校的導師不是很有幫助,我的同學也不是。

+0

您是否需要使用遞歸? – Bohemian 2014-11-09 14:05:38

回答

0

的想法是,如果n是奇數,要立即打印n*n(這將打印降序奇廣場),然後進行與n-1遞歸調用,如果n甚至一段時間,您首先進行用n-1遞歸調用,然後打印n*n(在所有奇數方塊打印完畢後,將按升序打印偶數方塊)。

public static void writeSquares(int n){ 
    if(n<1) 
     throw new IllegalArgumentException(); 
    if (n==1) 
     System.out.print(1 + ","); 
    else if (n % 2 == 1) { 
     System.out.print(n*n + ","); 
     writeSquares (n - 1); 
    } else { 
     writeSquares (n - 1); 
     System.out.print(n*n + ","); 
    } 
} 

編輯:此代碼將在最後產生額外的,

25,9,1,4,16, 

爲了擺脫它,你可能需要一個布爾參數添加到方法,這表明無論是在方法或不是第一個電話。

對於writeSequence,這個想法是解決n的問題,假設您已經有n - 1的解決方案。如果您有一種方法,寫入n - 1的序列,爲了將其擴展爲n,您必須打印n,打印n - 1的序列,然後再打印n。另外,您需要一個停止條件,即n==1,在這種情況下,您只需打印1

public static void writeSequence(int n) 
{ 
    if(n<1) 
     throw new IllegalArgumentException(); 
    if (n==1) 
     System.out.print(1 + " "); 
    else { 
     System.out.print(n + " "); 
     writeSequence (n-1); 
     System.out.print(n + " "); 
    } 
} 

編輯:

我錯過了在關於第二遞歸問題的一些細節。這是更新的方法。我不確定是否可以通過單一方法獲得所有邏輯。根據n是奇數還是偶數,我不得不將它分成兩個遞歸方法。

public static void writeSequence(int n) 
{ 
    if (n%2 == 0) 
     writeSequenceEven (n); 
    else 
     writeSequenceOdd (n); 
} 

public static void writeSequenceOdd(int n) 
{ 
    if (n == 1) { 
     System.out.print (1 + " "); 
    } else if (n>1) { 
     System.out.print((1+n/2) + " "); 
     writeSequenceOdd (n-2); 
     System.out.print((1+n/2) + " "); 
    } 
} 

public static void writeSequenceEven(int n) 
{ 
    if (n>1) { 
     System.out.print(n/2 + " "); 
     writeSequenceEven (n-2); 
     System.out.print(n/2 + " "); 
    } 
} 
+0

writeSequence的思想是它只能打印n個整數。例如: writeSequence(7); \t 4 3 2 1 2 3 4 | | writeSequence(8); \t 4 3 2 1 1 2 3 4 | | writeSequence(9); \t 5 4 3 2 1 2 3 4 5 | 但我的代碼不會在奇數n的中間做兩個1 編輯:我想我可能不得不使用兩種方法,因爲最初的問題集之一需要另一個輔助方法 – 2014-11-09 08:26:00

+0

@JohnB對不起,我沒有'仔細閱讀這個問題。我會編輯答案。 – Eran 2014-11-09 08:28:22

+0

@JohnB編輯回答 – Eran 2014-11-09 08:36:14

0

創建EvenList和oddList

如果平方值相匹配的條件,即使把它放在evenList,否則在oddList 2周的ArrayList。按相反的順序和打印evenList

首頁打印oddList,因爲它是從索引0

+0

但是,這不需要我使用循環來瀏覽列表嗎?我需要使用遞歸 – 2014-11-09 08:11:09

1
public void writeSequence(int n){ 
    if(n < 1){ 
     throw new IllegalArgumentException(); 
    } 
    if(n==1){ 
     System.out.print(n); 
    } 
    else if(n==2){ 
     System.out.print(n/2 +" " + n/2); 
    } 
    else if(n%2 ==0){ 
     System.out.print(n/2 +" "); 
     writeSequence(n-2); 
     System.out.print(" " +n/2); 
    } 
    else if(n%2 ==1){ 
     System.out.print((n/2+1) +" "); 
     writeSequence(n-2); 
     System.out.print(" "+(n/2 +1)); 
    } 
} 
1

我意識到這是一個古老的線程,但在任何情況下,仍然得到進入這個網頁,我只是有這個問題以及。這就是我沒有幫助者的方法來回答問題的方法。順便說一下,它接近於Eran的第一個答案,除了我把我的writeSequence從if語句中提取出來之外。這工作。

public void writeSquares(int n) { 

    //for exception 
    if (n < 1) { 
     throw new IllegalArgumentException(); 

    //for base 
    } else if (n == 1) { 
     System.out.print("1"); 
     return; 
    } 

    //printing evens before base 
    // commas trail number now 
    if ((n % 2) != 0) { 
     System.out.print((n * n) + ", "); 
    } 
    //does this until base 
    writeSquares(n - 1); 

    //then as we start coming back out of the method calls print evens 
    // commas before lead numbers now 
    if ((n % 2) == 0) { 
     System.out.print(", " + (n * n)); 
    } 
}