Java 递归如此混乱
我正在尝试编写一个程序来接受全名(即Java 递归如此混乱,java,recursion,Java,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)
名、中间名和姓
),并使用递归显示姓名首字母和姓氏
样品-
输入: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;
}
}
import java.io.*;
scbose类{
字符串st,st1;
int d,l;
scbose(){
st=“”,st=“”;
d=0,l=0;
}
字符串短名称(字符串str){
如果(l
但是当我使用输入subhas chandra bose
,输出是这样的s.c.bosebosebose
这个递归程序有什么问题?对于使用递归,您应该能够将您的问题拆分为类似的较小问题。您知道
fib
经典示例
使用相同的方法,您可能希望递归如下所示:
shortname(str) = str if str doesn't contain spaces
firstchar(str) + "." + shortname(str after removing the fist word and trimming it)
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));
}
}
就像注释中提到的@stephen一样,您不应该使用实例变量。行
st=st+str.substring(d)代码>每次都在循环中执行。i、 e.您每次都在循环中添加姓氏
不能将递归用于两个目的
相反,您可以这样做:
shortname(str) = str if str doesn't contain spaces
firstchar(str) + "." + shortname(str after removing the fist word and trimming it)
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));
}
}
类scbose{
字符串st,st1;
静态int d,l;
scbose(){
st=”“;
st1=“”;
d=0;
l=0;
}
字符串短名称(字符串str){
如果(l
您缺少一个其他的:
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;
}
String短名称(String str){
如果(l
如果你不放st=st+str.substring(d)
在else
块中,语句在每次递归调用中执行一次,而不仅仅是在到达字符串的末尾时执行一次
这项任务最好是而不是使用递归,因为递归版本比简单循环更难理解,效率更低
此外,使用char
文字而不是以数字形式编写的字符代码的程序更容易阅读(最好使用'
而不是32
)。好的,至少结果应该是清楚的。你的意图是,l和d不是局部变量吗?您知道shortname()总是用相同的参数值调用吗?st1是干什么用的?为什么shortname()会返回一些东西,但它从未在递归中使用过?我的建议是:重新开始,不要依赖任何实例级变量。哦!是 啊谢谢!:-)