2013-10-22 100 views
0

我必須使用遞歸解決這個問題,我設法使它很快地工作,但我有點卡住了這一點。 我當前的代碼是JAVA:幫助修復遞歸函數

public static String ReverseR(String n){ 
    String finalstring=""; 
    int i = 0; 
    int len = n.length(); 
    while (i < len) { 
     finalstring += (n.charAt(len - 1)); 
     ReverseR(n.substring(0, len - 1)); 
     i++; 
    } 
    return finalstring; 
} 

當我輸入任何字符串,結果字符串的長度是否正確,但僅使用最後一個字母。例如:ReverseR(「你好」)= ooooo 有什麼想法?

+0

查看此鏈接尋求遞歸幫助:http://stackoverflow.com/questions/19526274/java-help-fixing-recursive-function – Tenner

+2

使用循環或遞歸。不是都。 –

回答

1

變化n.charAt(len - 1))n.charAt(len - i))

您一直都在與LEN -1同一個地方;)

[編輯]

while (i < len){ 
    finalstring += (n.charAt(len - 1 - i)); 
    ReverseR(n.substring(0, len - 1 - i)); 
    i++; 
} 

這將解決你的代碼,但是你必須選擇whileReverseR(...)

重複的問題,請檢查此Reversing a String with Recursion in Java

+1

雖然這確實解決了問題,但是它不需要遞歸:)(這可能是OP作業所需的)。 – jtahlborn

+1

這將拋出'StringIndexOutOfBoundsException' –

5

遞歸有點像歸納法證明。

  1. 擺脫while循環的
  2. 如果要反轉0個字符的字符串,這很簡單:只返回「」
  3. 如果你是一個反轉正字符串,反轉[ 0..n-2]並在最後一個字母前加上。你已經在做什麼了。
+2

也「記住,在Java中的字符串不可變,你需要_return_修改後的字符串」 – jtahlborn

+0

感謝您的反饋,我會牢記在心。 – Howcan

0

這裏是一個完全可行的解決方案

public static String reverse(final String s) { 
    if (s == null) { 
     throw new NullPointerException(); 
    } 

    final int length = s.length(); 
    if (length <= 1) { 
     return s; 
    } else { 
     // s = start + lastChar 
     final String start = s.substring(0, length - 1); 
     final char lastChar = s.charAt(length - 1); 
     return lastChar + reverse(start); 
    } 
} 
0

你的遞歸算法不應要求任何循環,即whilefor循環。任何循環結構本質上都可以通過遞歸實現,而不會觸及循環。基本遞歸字符串逆轉的例子可能是這樣的:

public static String reverseR(String n){ 
    if (n.length() <= 1) return n; 
    return reverseR(n.substring(1))+n.charAt(0); 
} 

有了這個算法,你基本上說: 回報「的每一個字母的反轉,但第一個」 +「的第一個字母」

寫一個遞歸算法有助於做出很多假設。首先假設你的反轉函數起作用,然後把它放在自身的任何位置,只要你想扭轉你的一部分字符串。只要記得添加一個基本案例,你就會變得金黃。語言如HaskellProlog將使您習慣於遞歸算法,因爲這是他們的主要迭代源。

+0

從這裏複製代碼http://stackoverflow.com/questions/9723912/reversing-a-string-recursion-java –

+0

啊,很好找。看起來這是一個很常見的做法! – user2466999