2009-11-12 48 views
2

嘿,我正在處理一個問題,您將使用遞歸垂直打印字符串。我知道如何做到這一點,如果我要使用循環:在Java中垂直使用遞歸打印字符串

for (int i = 0; i < str.length(); i++) { 

    System.out.println(str.charAt(i)); 

但我不完全知道如何使用遞歸。我照顧的基本情況,但我不知道如何繼續:

if (str == null || str.equals("")) { 

    return str; 

任何幫助將不勝感激。謝謝!!!

回答

0

理解遞歸的關鍵是理解遞歸。 (bah dum bum)

但是,嚴肅地說,你應該從已經存在的問題中考慮一個小問題。在這個例子中,你有一段長度的字符串;你怎麼能打印該字符串的一部分,然後有一個更小的字符串重複該過程?這是遞歸的基本思想。

你的基本情況是正確的,這樣一種方式,你可以使用Java庫和上面的代碼去了解它:

public String printVertical(String str) 
{ 
    if (str == null || str.equals("")) 
    { 
     return str; 
    } 
    else 
    { 
     System.out.println(str.charAt(0)); 
     return printVertical(str.substring(1, str.length); 
    } 
} 
+1

你爲什麼回來?順便說一下,你的方法原型是無效的 – 2009-11-12 04:34:21

+0

你是絕對正確的,我忙着考慮樹木爲我自己的任務,顯然有點模糊。更正! – Feanor 2009-11-12 04:37:52

0

你爲什麼要這樣做?這顯然是迭代過程比遞歸實現更容易實現的情況。

有幾種方法可遞歸處理。由於您正在使用Java,因此我建議您查看Java核心庫中的String.substring方法。

1

如果有疑問,可以隨時轉換迭代直接到遞歸:

for (int i = 0; i < str.length(); i++) 
    System.out.println(str.charAt(i)); 

...變爲:

public void printVertical(String str, int i) { 
    if (i < str.length()) { 
     System.out.println(str.charAt(i)); 
     printVertical(str, i + 1); 
    } 
} 

String inputStr = ... 
printVertical(inputStr, 0); 

注意,有一些更多的這樣做的許多方面優雅。這感覺就像是給我做家庭作業。我建議你找一個主觀上更好的方法,而不是使用我的循環的「盲目翻譯」。

+0

比使用子 – 2009-11-12 04:47:45

+0

我不同意更好。更好的解決方案是使用'substring',因爲它使用了更多的「分而治之」的方法。我的「解決方案」只是一個僞裝的循環。 – 2009-11-12 04:51:25

0

這應該做的伎倆:

​​

遞歸的一點是,你必須調用自身的功能。

1
public void printVertString(String str) { 
    if (str != null && str.length > 0) //1 base condition 
    { 
     System.out.println(str.charAt(0)) //2 print first char 
     printVertString(str.substring(1)) //3 recursive call, but first char is omitted 
    } 
} 

這裏做的事情:

  1. 檢查字符串不是空的(基本情況)。如果是的話,不應該有任何更多的遞歸和方法只返回而不做任何事情
  2. 打印字符串的第一個字符
  3. 自稱,但只有第二個字符起

所以,如果你發送一個海峽=「CAT」,以下是發生了什麼(縮進區分同一功能的不同調用)

1 str is "CAT" --> not empty 
2 print "C" 
3 call printVertString "AT" 
    1 str is "AT" --> not empty 
    2 print "A" 
    3 call printVertString "T" 
     1 str is "T" --> not empty 
     2 print "T" 
     3 call printVertString "" 
      1 str is "" --> EMPTY 
      return