2012-03-15 42 views
44

Dưới đây là một số mã Java để đảo ngược chuỗi một cách đệ quy.Đảo ngược chuỗi có đệ quy trong Java

Ai đó có thể cung cấp giải thích về cách hoạt động của nó?

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

Tôi không hiểu làm thế nào điều này có thể hoạt động.

+5

Sử dụng đệ quy để đảo ngược chuỗi là dấu hiệu rõ ràng của một lập trình viên xấu. – DwB

+16

Bài tập về nhà, @DwB - Tôi nghĩ đó là một cuộc biểu tình hợp lý về đệ quy. – adelphus

+0

@DwB nó có thẻ bài tập về nhà, vì vậy họ có thể sử dụng nó để dạy đệ quy.Một trong những cách dễ nhất để hiểu cách đệ quy hoạt động lần đầu tiên – jzworkman

Trả lời

85

Chức năng mất ký tự đầu tiên của một String - str.charAt(0) - đặt nó ở cuối và sau đó tự gọi mình - reverse() - trên Phần còn lại - str.substring(1), thêm hai điều này lại với nhau để có được kết quả của nó - reverse(str.substring(1)) + str.charAt(0)

khi được thông qua vào string là một ký tự hoặc ít hơn và do đó sẽ không có dư để lại - khi str.length() <= 1) - nó dừng lại tự xưng là đệ quy và chỉ trả về Chuỗi được chuyển vào.

Vì vậy, nó chạy như sau:

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

Chạy qua trình gỡ lỗi. Tất cả sẽ trở nên rõ ràng.

+3

"cho đến nay, câu trả lời hay nhất"? Vậy tại sao nó nhận được 0? Và tại sao mọi người tiếp tục nói để xem nó chạy trên dây dài như vậy? Và trong những trường hợp nào nó chấm dứt trên "null == str"? Ngay cả một đối tượng String mới được tạo ra cũng không làm điều này. Chiều dài của một đối tượng String rỗng là gì? –

18

Bạn cần nhớ rằng bạn sẽ không chỉ có một cuộc gọi - bạn sẽ có một cuộc gọi lồng nhau. Vì vậy, khi cuộc gọi "lồng tiếng cao nhất" trả về ngay lập tức (khi nó chỉ tìm thấy "o"), cấp độ tiếp theo sẽ mất str.charAt(0) - trong đó str là "lo" tại thời điểm đó. Vì vậy sẽ trả về "ol".

Sau đó Next Level sẽ nhận được "ol", thực hiện str.charAt(0) cho giá trị của str (đó là "llo"), trở về "oll" lên tầm cao mới ra.

Sau đó Next Level sẽ nhận được "oll" từ cuộc gọi đệ quy của mình, thực hiện str.charAt(0) cho giá trị của str (đó là "ello"), trở về "Olle" lên tầm cao mới ra.

Sau đó thức cấp sẽ nhận được "oll" từ cuộc gọi đệ quy của mình, thực hiện str.charAt(0) cho giá trị của str (đó là "hello"), trở về "olleh" cho người gọi ban đầu.

Nó có thể làm cho tinh thần để nghĩ về chồng như bạn đi:

// 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

Tôi nghĩ rằng đây là lời giải thích đơn giản chính xác và không phải là một trong những chấp nhận bởi vì cuộc gọi đệ quy sẽ được đánh giá đầu tiên và sau đó "str.charAt (0)". nó sẽ được hiểu rõ hơn bằng cách tách dòng cuối cùng thành hai dòng "String ab = reverse (str.substring (1)); trả về ab + str.charAt (0);" – Jayesh

2

Bởi vì đây là đệ quy đầu ra của bạn tại mỗi bước sẽ là một cái gì đó như thế này:

  1. "Hello" được nhập vào. Sau đó, phương thức tự gọi với "ello" và sẽ trả về kết quả + "H"
  2. "ello" được nhập. Phương thức tự gọi là "llo" và sẽ trả về kết quả + "e"
  3. "llo" được nhập. Phương thức tự gọi là "lo" và sẽ trả lại kết quả + "l"
  4. "lo" được nhập. Phương thức tự gọi là "o" và sẽ trả lại kết quả + "l"
  5. "o" được nhập.Phương pháp này sẽ đạt điều kiện if và trở lại "o"

Vì vậy, bây giờ để kết quả:

Tổng giá trị trả về sẽ cho bạn kết quả của các cuộc gọi của đệ quy cộng với char đầu tiên

để sự trở lại từ 5 sẽ là: "o"

sự trở lại từ 4 sẽ là: "o" + "l"

sự trở lại từ 3 sẽ là: "ol" + "l"

.210

Sự trở lại từ 2 sẽ là: "oll" + "e"

Sự trở lại từ 1 sẽ là: "Olle" + "H"

này sẽ cung cấp cho bạn kết quả của "olleh"

0

Lấy chuỗi Xin chào và chạy nó qua đệ quy.

Vì vậy, cuộc gọi đầu tiên sẽ trở lại:

return reverse(ello) + H 

Second

return reverse(llo) + e 

nào cuối cùng sẽ trở olleH

0

Các cuộc gọi đến reverce (substring (1)) wil được thực hiện trước khi thêm charAt (0). kể từ khi cuộc gọi được lồng nhau, ngược lại trên chuỗi con sẽ được gọi trước khi thêm ký tự thứ hai (ký tự đầu tiên mới vì đây là chuỗi con)

đảo ngược ("ello") + "H" = " olleH "
--------^-------
đảo ngược (" llo ") +" e "=" olle "
---------^- ---
đảo ngược ("lo") + "l" = "oll"
--------^-----
đảo ngược ("o") + "l" = "ol "
---------^----
"o" = "o"

2

Run mã dưới đây - nó in:

Bước 0: ello/H
Bước 1: llo/e
Bước 2: lo/l
bước 3: o/l
bước 3 lợi nhuận: ol
bước 2 lợi nhuận: oll
bước 1 lợi nhuận: Olle
bước 0 lợi nhuận: olleh

Code:

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

chạy sau đây và bạn sẽ thấy những gì đang xảy ra:

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

Giải pháp tốt nhất những gì tôi tìm thấy.

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));         
     } 
    } 
} 

Output: C: \ Users \ admin \ Desktop> java quản lý Sameer sau khi ngược lại: reemaS Độc thân nhân vật một sau khi ngược lại: một Null Giá trị sau ngược: null Rahul sau khi ngược lại: 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

Một giải pháp khác để đảo ngược chuỗi trong Java.

Chuyển đổi chuỗi của bạn thành mảng char sử dụng hàm .toCharArray().

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)); 
} } 

Đây là một đoạn mã mẫu, điều này có thể giúp bạn. Đã làm cho tôi.

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

Mẫu nội tuyến;

public static String strrev(String str) { 
    return !str.equals("") ? strrev(str.substring(1)) + str.charAt(0) : str; 
} 
Các vấn đề liên quan