2015-08-30 162 views
-2

我正在嘗試編寫一個程序來接受全名(即first name, middle name and lastname)並使用RECURSION顯示姓氏以及姓氏。遞歸令人困惑

的Sample-

輸入:蘇巴斯·錢德拉·鮑斯
輸出:SCBose

import java.io.*; 
class scbose { 
    String st, st1; 
    int d, l; 
    scbose() { 
     st = "", st = ""; 
     d = 0, l = 0; 
    } 
    String shortname(String str) { 


     if (l < str.length()) { 
      if (str.charAt(l) == 32) { 

       st = st + str.charAt(d) + "."; 
       d = l + 1; 
      } 
      l++; 
      shortname(str); 
     } 
     st = st + str.substring(d); 
     return st; 

    } 
} 

但是當我使用的輸入subhas chandra bose,輸出是這樣s.c.bosebosebosebosebose ...

什麼這是遞歸程序中的問題嗎?

+0

好的,至少很清楚結果應該是什麼。是你的意圖嗎,我和d不是局部變量?你知道shortname()總是用相同的參數值調用嗎?什麼是st1 for?爲什麼shortname()返回一些東西,但它從來沒有用在遞歸中? –

+0

我的建議:重新開始,不要依賴任何實例級別的變量。 –

回答

0

對於使用遞歸,你應該能夠將你的問題分解成類似的小問題。你知道fib的經典例子。

使用同樣的,你可能會想你的遞歸是這樣的:

shortname(str) = str if str doesn't contain spaces 
       firstchar(str) + "." + shortname(str after removing the fist word and trimming it) 

就像在評論中提到@stephen,你不應該使用實例變量。

0

st = st + str.substring(d);正在循環中執行。即您每次在循環中添加姓氏。

您不能爲了兩個目的使用遞歸。

相反,你可以做這樣的事情:

class scbose { 
    String st, st1; 
    static int d, l; 
    scbose() { 
     st = ""; 
     st1 = ""; 
     d = 0; 
     l = 0; 
    } 
    String shortname(String str) { 
     if (l < str.length()) { 
      if (str.charAt(l) == 32) { 

       st = st + str.charAt(d) + ". "; 
       d = l + 1; 
      } 
      l++; 
      shortname(str); 
     } 
     return st; 

    } 
    String lastname(String abc){ 
     String last =abc.substring(d); 
     return last; 
    } 
    public static void main(String [] args){ 
     scbose sc = new scbose(); 
     String check = "subhas chandra bose"; 
     System.out.println(sc.shortname(check)+sc.lastname(check)); 
    } 
} 
0

你缺少一個else

String shortname(String str) { 
    if (l < str.length()) { 
     if (str.charAt(l) == ' ') { 
      st = st + str.charAt(d) + "."; 
      d = l + 1; 
     } 
     l++; 
     shortname(str); 
    } else { 
     st = st + str.substring(d); 
    } 
    return st; 
} 

如果你不把st = st + str.substring(d);else塊內,該語句執行每次遞歸調用而不是僅當String的末尾達到

使用遞歸可以更好地完成此任務而不是,因爲遞歸版本比簡單的循環更難於理解和效率低下。

而且它更易於閱讀使用的寫成數字字符代碼char文字instread程序(更好地利用' '代替32)。

+0

哦!是啊!謝謝! :-) – Eddy