2014-04-23 49 views
2

我目前正在掌握Java中的遞歸。遇到以下代碼,我無法弄清楚遞歸方法如何生成反向字符串。任何解釋將不勝感激!在Java中使用遞歸逆向字符串

class Backwards { 
    String str; 

    Backwards(String s) { 
     str = s; 
    } 

    void backward(int idx) { 
     if(idx != str.length()-1) { 
      backward(idx+1); 
     } 
     System.out.print(str.charAt(idx)); 
    } 
} 

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

     Backwards s = new Backwards("This is a test"); 
     s.backward(0); 
    } 
} 
+0

它應該是更好,如果你創建'Backwards' **方法,而不是'Backwards' ** class ** – Baby

+1

@ImmerAllein它[肯定](http://www.oracle.com/technetwork/java/index-135089.html)最好不要以大寫字母開頭的方法。 –

回答

1

看那backward方法。它能做什麼? 循序漸進:

  1. 如果這不是最後一個字符(最後一個字符的索引),你的下一個字符指數
  2. 打印出當前字符在調用這個函數。

所以,如果我們擴大遞歸調用,這將是(字符串 「HEL」):

  1. 呼叫落後(0)(其將在年底印刷0個字符)
  2. 它將後向呼叫(1)(這將在結束打印1-ST字符)
  3. 它將後向呼叫(2)(...)
  4. 有遞歸調用不會被稱爲2- nd特性是最後的
  5. 第三個呼叫將在打印後的最後一個字符後結束:「l」
  6. 控件將轉到上一個呼叫,這將輸出「e」
  7. 控件將轉到第一個後向調用,它將輸出「h 「

可視化:visualizations

所以,最終的輸出爲 」列城「,這是我們想要的。

2

如果使用筆和紙對它進行調試,可以很容易地看到發生了什麼。

基本上 - 它到字符串的末尾,並從字符開始打印字符從結尾到開始。

1

以字符串「ABCD」爲例。

backward(0) 
{ 
    backward(1) 
    { 
    backward(2) 
    { 
     backward(3) 
     { 
     print D 
     } 
     print C 
    } 
    print B 
    } 
    print A 
} 
0

看看後面的方法。

void backward(int idx) { 
if(idx != str.length()-1) { 
    backward(idx+1); 
} 
System.out.print(str.charAt(idx)); 

}

它需要的索引號,並打印在該索引位置的字符。 然後再次調用它自己(這就是爲什麼它是遞歸的),但現在索引增加1,因爲您要打印下一個字符 - 反向(idx + 1);

看不同的索引號的效果:

Backwards s = new Backwards("test"); 

指數= 0 第向後(0); 輸出:tset

索引= 1 s.backward(1); 輸出:tse

Index = 2 s.backward(2); 輸出:TS

0

你的類:

public class Backwards { 
    String str; 

    Backwards(String s) { 
     str = s; 
    } 

    String backward(int i) { 
     int j = i+1; 
     if(i <= str.length()) 
      return str.charAt(str.length()-i) + backward(j); 
     return ""; 
    } 
} 

在主:

public static void main(String[] args) { 

    Backwards s = new Backwards("This is a test"); 
    System.out.println(s.backward(1)); 

}