2015-08-30 163 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