我正在尝试编写一个程序来接受一个全名(即first name, middle name and lastname
)并使用RECURSION显示姓氏和姓氏。
样本 -
输入:Subhas Chandra Bose
输出:S.C.Bose
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 :(得分:0)
对于使用递归,您应该能够将问题分解为类似的较小问题。您知道fib
经典示例。
使用相同的,你可能希望你的递归是这样的:
shortname(str) = str if str doesn't contain spaces
firstchar(str) + "." + shortname(str after removing the fist word and trimming it)
与评论中提到的@stephen一样,您不应该使用实例变量。
答案 1 :(得分: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));
}
}
答案 2 :(得分:0)
您错过了/lib/jquery/jquery.js
:
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
代替' '
)。