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()会返回一些东西,但它从未在递归中使用过?我的建议是:重新开始,不要依赖任何实例级变量。哦!是 啊谢谢!:-)