在Java中递归删除字符

时间:2012-02-05 20:30:04

标签: java methods recursion character

作为练习,下面的代码块打算递归遍历一个字符串并删除所有的“x”字符。它这样做,但我想跟踪newStr而不将其作为方法中的参数传递。无论如何将它移动到方法体中?

谢谢!

public static String deathToX(String str, String newStr) {  
    //look for x char
    if(str.substring(0, 1).equals("x")) {
        //do nothing
    } else {
        //add non-x char to newStr
        newStr += str.charAt(0);
    }

    if(str.length() == 1) {
        return newStr;
    }

    return deathToX(str.substring(1), newStr);
}

public static void main(String[] args) {
    System.out.println("Return: " + deathToX("xnoxmore", ""));
}

4 个答案:

答案 0 :(得分:6)

好吧,您可以将代码更改为:

public static String deathToX(String str)
{   
    // Termination case
    if (str.length() == 0)
    {
        return str;
    }
    // Work out whether or not we want the first character
    String prefix = str.startsWith("x") ? "" : str.substring(0, 1);

    // Let the recursive call handle the rest of the string, and return
    // the prefix (empty string or the first character) followed by the
    // x-stripped remainder.
    return prefix + deathToX(str.substring(1));
}

这是你想到的那种吗?

当然,这是一种非常低效的字符串操作方式,但我认为你对事物的递归本质更感兴趣。

答案 1 :(得分:1)

  

我想跟踪newStr而不将其作为方法中的参数传递。

为什么呢?在函数式递归编程中经常需要将中间结果传递给函数。我所做的是创建一个处理大量工作并接受累加器的函数,并创建一个包装函数,该函数使用所需的起始值调用前一个函数:

private static String deathToX0(String str, String newStr) {
    // the original implementation
}

public static String deathToX(String str) {
    return deathToX(str, "");
}

另外,由于涉及复制,您可能不希望使用String作为中间结果。 StringBuilder会更快。

答案 2 :(得分:0)

简短的答案是肯定的...通常在树的下方进行递归,你可以计算出每个级别的位,在这种情况下为空白或当前字符。所以return语句应该递归地调用自己,然后在树的底部,通过将每个级别的部分加在一起来重构你想要的答案。

public static String deathToX(String str){
    if (!str.isEmpty()){
        return (str.substring(0, 1).equals("x") ? "" : str.substring(0, 1)) + deathToX(str.substring(1));
    }else{
        return "";
    }
}

public static void main(String[] args){
    System.out.println("Return: " + deathToX("xnoxmore"));
}

在上面的示例中,我使用简写格式if将所有内容放在一行但您可以将其展开。您应该能够看到递归函数在return语句上进行递归,并且我为最后一级添加了一个特殊情况。如果您要将其拆分并将此级别答案放在本地变量中,例如然后你会使用:

return tmp + deathToX(str.substring(1));

记住递归意味着当前执行只会暂停,直到较低的完成,这样您就可以愉快地存储信息以便在备份时恢复。希望这会有所帮助:)

答案 3 :(得分:0)

public class solution {

    // Return the changed string
    public static String removeX(String input){
    if(input.equals("") || input.equals("x"))
            return "";

        String returnStr="";
        removeX(input.substring(1));
        for(int i=0;i<input.length();i++)
        {
            if(input.charAt(i)=='x')
                continue;
            else
                returnStr+=input.charAt(i);
        }
        return returnStr;
    }
}

这是我的方法。此代码转到字符串的末尾,如果它得到X作为最后一个字符串,则返回“”(无),然后检查整个子字符串中的“ x”,如果它存在于字符串中,则将继续,否则,它将继续。将其余字符附加到该字符串,然后继续。 最后返回更新后的字符串。 希望这可以帮助..!!好吧,这是我在这里的第一个贡献:)