递归如此令人困惑

时间:2015-08-30 11:17:28

标签: java recursion

我正在尝试编写一个程序来接受一个全名(即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 ......

这个递归程序有什么问题?

3 个答案:

答案 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代替' ')。