2011-06-06 87 views
1

你好 爲什麼我的使用遞歸的逆向方法不起作用? print語句顯示操作已正確完成,但最終似乎只有整個字符串的ast字符被分配給h。反向字符串遞歸方法

public static String reverse(String s,String h){ 

    if(s.length()==0){ 

     return s; 

    } else { 


     h+=s.charAt(s.length()-1); 
     System.out.println(h);//FOR TEST 
     s=s.substring(0,s.length()-1); 
     reverse(s,h); 
     return h; 
    } 

} 

有什麼建議嗎?

回答

5

使用

return reverse(s,h); 

,而不是 返回小時;

即:

public static String reverse(String s,String h){ 

    if(s.length() == 0){ 

     return h; 

    } else { 


     h+=s.charAt(s.length()-1); 
     System.out.println(h);//FOR TEST 
     s=s.substring(0,s.length()-1); 
     return reverse(s,h); //NOTICE THE CHANGE HERE, 
    } 

} 
+0

-1作爲裸碼,沒有任何解釋。 – luqui 2011-06-06 05:33:44

+0

不完全:這將返回一個空字符串。 – trutheality 2011-06-06 05:49:00

+0

@ trutheality:沒有注意到tht ... thx修復了它... – Chandu 2011-06-06 05:51:55

4

字符串在Java中是不可變的。所以在此代碼中:

private static void foo(String x) { 
    x += "bar"; 
} 

public static void main() { 
    String a = "foo"; 
    foo(a); 
    System.out.println(a); 
} 

將只打印"foo"。它的工作方式與int類似。

所以你的reverse函數需要對返回值做些什麼。當你打電話給reverse(s,h)時,你正在拋出遞歸調用的返回值。你需要把它:

String rec = reverse(s,h); 
return ... something involving rec ...; 
1

兩件事:

public static String reverse(String s,String h){ 

    if(s.length()==0){ 

     return h; /// This needs to return the reversed string (h). 

    } else { 


     h+=s.charAt(s.length()-1); 
     System.out.println(h);//FOR TEST 
     s=s.substring(0,s.length()-1); 
     h = reverse(s,h); /// You need to use the return value 
     return h; 
    } 

} 

它看起來像你試圖使用返回按引用參數來改變小時。你必須記住,在Java中,所有東西(包括對象的引用)都是按值傳遞的。一旦寫入s=s.substring(0,s.length()-1);s就成爲對不同String對象的引用,並且該更改不會傳播到調用函數。

另外,還有一種方法只用一個輸入參數來實現。

1

我覺得這種方式是使用遞歸方法扭轉了串好:

public class Reversestringbyrecursivefunction { 

    public static void main(String[] args) 
    { 
     Scanner input=new Scanner(System.in); 
     while(true) 
     { 
      System.out.print("[?] Enter String('q' for exit)> "); 
      String str=input.next(); 
      if(str.equals("q")) 
       break; 
      System.out.println("this string created by reversed recursive function : "+revers(str)); 
      System.out.print("\n==========================\n"); 
     } 
     System.out.print("\n\n\t\t\t[ GOOD LUCK!!! ]\n"); 
    } 
    static String revers(String str) 
    { 
     if(str.length()<=1) 
      return str; 
     else 
      return revers(str.substring(str.length()-1, str.length()))+revers(str.substring(0, str.length()-1)); 
    } 
} 

但是,爲了獲得最佳性能,你應該改變這一行:

return revers(str.substring(str.length()-1, str.length()))+revers(str.substring(0, str.length()-1)); 

到:

return str.substring(str.length()-1)+revers(str.substring(1, str.length()-1)+str.substring(0,1); 

在上一行中:在最佳性能和一個階段中,只能交換輸入字符串的1個字符。但是,在新行中:在一個階段中,您可以交換輸入字符串的兩個字符