2014-02-15 37 views
0

嗨,我想創建一個方法來打印一個字符數組相反的順序使用遞歸?使用遞歸以相反順序打印char數組的方法?

這是我迄今所做的: -

public class StringReverseOnCharArray { 

    public static void main(String[] args) { 
     reverseRecursively(new char[]{'a','b','c'}); 
    } 

    private static void reverseRecursively(char[] myCharArr) 
    { 
     System.out.println(myCharArr[myCharArr.length-1]); 
     char [] temp= 
       // what next?? 

     reverseRecursively(temp); 
    } 

} 

我覺得一個臨時字符數組會做,但我應該怎麼做才能從原來的字符數組中刪除最後一個元素,並創建一個臨時的?或者是否有其他方式來做到這一點?

+0

http://stackoverflow.com/questions/2137755/how-do-i-reverse-an- int-array-in-java? – Aquillo

+1

遞歸不是一個合適的技術。 –

+0

您也可以在您的方法中添加一個參數,該參數將保存索引的當前值。然後在每次調用時遞減索引,並在索引爲0時停止遞歸。 –

回答

0

更新答案

我想我誤解了。如果您使用功能聲明,只需填寫temp位,而你只需要輸出陣列中的相反順序(實際上沒有更改其內容),那麼它很簡單:只要讓temp副本length - 1數組的字符(可能使用System.arraycopy)並將新的更短的數組傳遞給函數。如果您收到的數組只有一個字符長度,請不要這樣做;這就是你的遞歸終止條件(你總是必須有一些能夠阻止遞歸的東西,當你想要遞歸地做某件事時,它應該是你首先考慮的事情之一)。


原來的答覆

在我看來,一個任務告訴你使用了錯誤的技術的問題並不是一個非常有用的任務。遞歸有各種適當的教學練習;這不是其中之一。

但是讓我們看看分配:

遞歸的目標基本上是重複做一些事情,對這個問題的不同部分,直到你的問題作爲一個整體來完成。更好的例子是循環通過樹結構。

所以看着這個問題,你的目標是交換數組中的字符,直到數組被顛倒過來。這裏重複什麼?交換字符。

所以我可能會做一個索引我傳入函數,並有功能交換字符在該索引與字符在length - index位置(例如,交換第一個和最後一個,然後第二個和倒數第二等)。然後讓它自己與index + 1聯繫。

所有遞歸從根本上都必須具有「停止」條件:函數不再調用其自身的點。在你的情況下,這將是index >= length_of_array/2

請注意,我沒有發佈代碼。編寫代碼是爲了完成課程的任務,這是學習的重要組成部分。

+0

是啊,好像這是欺騙我,所以閱讀你的答案,讓我勇敢的挑戰問題,如果他否認添加另一個參數的方法:) – user3263540

+0

是的,這是也是一種方式..謝謝 – user3263540

0

正如指出,今年isn't normaly做遞歸。所以這個方案是不是很好,但它的工作原理:

public class StringReverseOnCharArray { 

    public static void main(String[] args) { 
     reverseRecursively(new char[] { 'a', 'b', 'c' }); 
    } 

    private static void reverseRecursively(char[] myCharArr) { 
     if (myCharArr.length > 0) { 
      System.out.println(myCharArr[myCharArr.length - 1]); 
      char[] temp = new char[myCharArr.length - 1]; 
      for (int i = 0; i < temp.length; i++) { 
       temp[i] = myCharArr[i]; 
      } 

      reverseRecursively(temp); 
     } 
    } 
} 
+0

沒有必要創建一個新的數組以使其遞歸。只需傳遞要在數組中打印的字符的索引,並通過從該索引中減去1來遞歸地調用該方法。這將至少保持它O(n),而不是O(n^2) –

+0

所以最後我將不得不循環:) – user3263540

+0

不。您首先調用數組和長度爲1的方法作爲參數。該方法在給定索引處打印char,然後使用數組和索引-1作爲參數調用自身,untile索引<0。 –

1

這是一個解決方案。

private static void reverseRecursively(char[] myCharArr, int next) { 
    if (next >= myCharArr.length) 
     return; 

    // use recusion BEFORE printing in order to print in reversed order 
    reverseRecursively(myCharArr, next+1); 
    System.out.println(myCharArr[next]); 
} 

首先調用方法應該爲 「下一個」 指數使用0:

reverseRecursively(myCharArr, 0); 
+0

是的,這個我gr8的解決方案,我可以使用,如果我可以添加一個參數 – user3263540

+0

如果你不允許添加一個參數,你需要創建一個新的數組沒有你打印的值,然後通過新陣列。它消耗更多的內存(並且需要更多的代碼才能這樣做),但我認爲效率是這個練習最後的一件事。 – ArneHugo

相關問題