2017-08-17 95 views
0

我正在練習遞歸(至少這是我想我試圖做的)。我的期望是代碼打印出「dlrow olleh」11次,但它只會打印一次。原因?遞歸不起作用

import java.lang.StringBuilder; 

public class Practice { 

    public static void main(String[] args){ 
     String str = "hello world"; 
     int count = new StringBuilder(str).length(); 
     System.out.print(backwards(str, count)); 
    } 

    public static String backwards(String word, int letters){ 

     while(letters>0){ 
      return new StringBuilder(word).reverse().toString(); 
     } 

     return backwards(word,letters-1); 
    } 
} 
+3

你似乎有交換了基本案例和遞歸案例。另外,遞歸中不需要while循環,這就是遞歸的用處 – UnknowableIneffable

+1

但是除了交換案例之外,在這裏使用遞歸沒有意義:所有遞歸調用都是遞減一個變量,然後執行當這個值達到零時。相反,只要立即做那件事。如果你想練習遞歸,確保你正在做一些需要遞歸的東西:) –

回答

0

您的基本情況似乎是首先觸發,而不是最後觸發。正如你將看到的,如果我向後調用(「Hello world」,11),那麼因爲字母> 0,它將返回新的StringBuilder(word).reverse.toString()

我想你的意思是轉換兩者。

0

所以基本上你沒有修改字母變量,所以一段時間不會結束。

但是,返回是打斷句子的陳述。

的recoursive的辦法是這樣的

public static void main(String[ ] args) { 
    String str = "hello world"; 
    int count = new StringBuilder(str).length(); 
    System.out.print(backwards(str, count - 1, new StringBuilder())); 
} 

public static String backwards(String word, int letters, StringBuilder sb){ 
    if (letters >= 0) { 
     sb.append(word.charAt(letters)); 
     return backwards(word, letters - 1, sb); 
    } else { 
     return sb.toString(); 
    } 

} 

通知我使用計數 - 1和字母> = 0,因爲該指數從0到大小 - 1