2012-03-15 61 views
44

以下是一些Java代碼以遞歸方式反轉字符串。在Java中使用遞歸來逆轉字符串

有人可以解釋它是如何工作的嗎?

public static String reverse(String str) { 
    if ((null == str) || (str.length() <= 1)) { 
     return str; 
    } 
    return reverse(str.substring(1)) + str.charAt(0); 
} 

我不理解這可能如何工作。

+5

使用遞歸來反轉字符串是一個壞程序員的明確標誌。 – DwB 2012-03-15 16:34:38

+16

這是作業,@DwB - 我認爲這是遞歸的合理示範。 – adelphus 2012-03-15 16:37:31

+0

@DwB它有一個作業標籤,所以他們可能使用它來教授遞歸。它是理解遞歸如何工作的最簡單方法之一 – jzworkman 2012-03-15 16:38:24

回答

85

該函數將一個字符串的第一個字符 - str.charAt(0) - 把它放在末尾,然後調用自己 - reverse() - 上其餘的 - str.substring(1),加入這兩個東西放在一起,以獲取其結果 - reverse(str.substring(1)) + str.charAt(0)

當傳入的String是一個個字符以內,因此不會有剩餘部分留 - 當str.length() <= 1) - 停止自稱遞歸和剛剛返回傳入的字符串。

所以它運行如下:

reverse("Hello") 
(reverse("ello")) + "H" 
((reverse("llo")) + "e") + "H" 
(((reverse("lo")) + "l") + "e") + "H" 
((((reverse("o")) + "l") + "l") + "e") + "H" 
(((("o") + "l") + "l") + "e") + "H" 
"olleH" 
3

通過調試器運行它。一切都會變得清晰。

+3

「迄今爲止,最好的答案」?那麼爲什麼它得到0?爲什麼人們會一直說要看它在這麼長的弦上運行?在什麼情況下它終止於「null == str」?即使是新創建的String對象也不會這樣做。畢竟空字符串對象的長度是多少? – 2013-03-14 01:58:11

18

你需要記住,你將不會只有一個調用 - 你將有嵌套調用。因此,當「最高度嵌套」呼叫立即返回(當它發現只是「o」)時,下一級將需要str.charAt(0) - 其中str在那個點是「lo」。所以這將返回「ol」。

然後水平將收到「OL」,爲的str值(這是「LLO」)執行str.charAt(0),返回「OLL」下一級進行。

然後水平將收到「OLL」從它的遞歸調用,對於str值(這是「ELLO」)執行str.charAt(0),返回「歐萊」下一級進行。

然後最終水平將收到「OLL」從它的遞歸調用,對於str值(這是「你好」)執行str.charAt(0),返回「2009東海生日賀」到原來的主叫方。

它可能是有意義的思考堆棧,當您去:

// Most deeply nested call first... 
reverse("o") -> returns "o" 
reverse("lo") -> adds 'l', returns "ol" 
reverse("llo") -> adds 'l', returns "oll" 
reverse("ello") -> adds 'e', returns "olle" 
reverse("hello") -> adds 'h', returns "olleh" 
+0

我認爲這是正確的簡單解釋,而不是接受的,因爲遞歸調用將首先被評估,然後是「str.charAt(0)」。將最後一行分爲兩行「String ab = reverse(str.substring(1)); return ab + str.charAt(0);」 – Jayesh 2016-03-07 05:17:03

2

因爲這是遞歸的每一步輸出會是這樣的:

  1. 「你好」被輸入。然後該方法使用「ello」調用它自己,並返回結果+「H」
  2. 「ello」被輸入。該方法用「llo」調用它自己,並將返回結果+「e」
  3. 「llo」被輸入。該方法使用「lo」調用它自己,並返回結果+「l」
  4. 「lo」被輸入。該方法以「o」自動調用並返回結果+「l」
  5. 輸入「o」。該方法將因此現在在打,如果條件並返回「O」

的結果:

的總收益價值會給你遞歸調用的結果加上第一個字符

到從5的返回將是: 「○」

從4所述的回報將是: 「O」 + 「L」

從3所述的回報將是: 「醇」 + 「升」

2的回報將是: 「OLL」 + 「E」

1的回報將是: 「歐萊」 + 「H」

這會給你 「2009東海生日賀」 的結果

0

取出字符串Hello並通過遞歸運行它。

所以第一次調用返回:

return reverse(ello) + H 

return reverse(llo) + e 

最終將返回olleH

0

的調用reverce(子(1))西港島線之前進行添加charAt(0)。 由於調用是嵌套的,因此在添加ex-second字符(新的第一個字符,因爲這是子字符串)之前調用子字符串的反向。

reverse(「ello」)+「H」=「 olleH「
--------^-------
reverse(」llo「)+」e「=」olle「
---------^- - ---
reverse(「lo」)+「l」=「oll」
--------^-----
reverse(「o」)+「l」=「ol 「
---------^----
「O」= 「o」 的

2

運行下面的代碼 - 它打印:

步驟0:ELLO/H
第1步:LLO/E
第2步:LO /升
步驟3:O /升
步驟3返回:醇
步驟2返回:OLL
步驟1返回:奧萊
步驟0返回:2009東海生日賀

代碼:

public class Test { 

    private static int i = 0; 

    public static void main(String args[]) { 
     reverse("Hello"); 
    } 

    public static String reverse(String str) { 
     int localI = i++; 
     if ((null == str) || (str.length() <= 1)) { 
      return str; 
     } 
     System.out.println("Step " + localI + ": " + str.substring(1) + "/" + str.charAt(0)); 
     String reversed = reverse(str.substring(1)) + str.charAt(0); 

     System.out.println("Step " + localI + " returns: " + reversed); 
     return reversed; 
    } 
} 
0

運行以下,你會看到這是怎麼回事:

public class RS { 

    public static String reverse(String str) { 
     System.out.println("--- reverse --- " + str); 
     if ((null == str) || (str.length() <= 1)) { 
      return str; 
     } 
     return add(reverse(str.substring(1)), charAt(str)); 
    } 

    public static char charAt(String s) { 
     System.out.println("--- charAt --- " + s); 
     return s.charAt(0); 
    } 

    public static String add(String s, char c) { 
     System.out.println("--- add --- " + s + " - " + c); 
     return s + c; 
    } 

    public static void main(String[] args) { 
     System.out.println("start"); 
     System.out.println("result: " + reverse("hello")); 
     System.out.println("end"); 
    } 

} 
0

最好的解決方案我發現了什麼。

public class Manager 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Sameer after reverse : " 
         + Manager.reverse("Sameer")); 
     System.out.println("Single Character a after reverse : " 
         + Manager.reverse("a")); 
     System.out.println("Null Value after reverse : " 
         + Manager.reverse(null)); 
     System.out.println("Rahul after reverse : " 
         + Manager.reverse("Rahul")); 
    } 

    public static String reverse(String args) 
    { 
     if(args == null || args.length() < 1 
           || args.length() == 1) 
     { 
      return args; 
     } 
     else 
     { 
       return "" + 
           args.charAt(args.length()-1) + 
           reverse(args.substring(0, args.length()-1));         
     } 
    } 
} 

輸出:C:\用戶\管理員\桌面>的java管理器 薩米爾反向後:反向後 空值::空 的Rahul反向後:反向後reemaS 單個字符luhaR

0
public class ReverseString{ 

private static String reverse(String text, String reverseStr){ 
    if(text == null || text.length() == 0){ 
     return reverseStr; 
    } 
    return reverse(text.substring(1), text.charAt(0)+reverseStr); 
} 
public static void main(String [] args){ 
    System.out.println(reverse("hello", "")); //output is "olleh" 
} 

}

0

用於在Java中反轉字符串的另一種解決方案。

使用.toCharArray()函數將字符串轉換爲char數組。

public static char[] reverse(char in[], int inLength, char out[], 
      int tractOut) { 

     if (inLength >= 0) { 
      out[tractOut] = in[inLength]; 
      reverse(in, inLength - 1, out, tractOut + 1); 
     } 

     return null; 

    } 
-1
import java.util.Scanner; 

public class recursion{ 
    public static void main (String []args){ 

    Scanner scan = new Scanner(System.in); 
    System.out.print("Input: "); 
    String input = scan.nextLine(); 

    System.out.print("Reversed: "); 
    System.out.println(reverseStringVariable(input)); 

    }public static String reverseStringVariable(String s) { 
     String reverseStringVariable = ""; 

     for (int i = s.length() - 1; i != -1; i--) { 
      reverseStringVariable += s.charAt(i); 

     } 

     return reverseStringVariable; 
    } 
} 
0
class Test { 
    public static void main (String[] args){ 
     String input = "hello"; 
     System.out.println(reverse(input)); 
    } 

    private static String reverse(String input) { 
     if(input.equals("") || input == null) { 
     return ""; 
    } 
    return input.substring(input.length()-1) + reverse(input.substring(0, input.length()-1)); 
} } 

下面是一個示例代碼段,這可能會幫助你。爲我工作。

0
import java.util.*; 

public class StringReverser 
{ 
    static Scanner keyboard = new Scanner(System.in); 

    public static String getReverser(String in, int i) 
    { 
     if (i < 0) 
     return ""; 
     else 
     return in.charAt(i) + getReverser(in, i-1); 
    } 

    public static void main (String[] args) 
    { 
     int index = 0; 

     System.out.println("Enter a String"); 
     String input = keyboard.nextLine(); 


     System.out.println(getReverser(input, input.length()-1)); 
    } 
} 
0

在線樣本;

public static String strrev(String str) { 
    return !str.equals("") ? strrev(str.substring(1)) + str.charAt(0) : str; 
}