Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中字符的递归删除_Java_Methods_Recursion_Character - Fatal编程技术网

Java中字符的递归删除

Java中字符的递归删除,java,methods,recursion,character,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 {

作为练习,下面的代码块打算递归地遍历字符串并删除所有“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", ""));
}

那么,您可以将代码更改为:

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));
}
那是你一直在想的事情吗

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

我希望跟踪newStr,而不将其作为方法中的参数传递

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

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

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

另一方面,由于涉及到复制,您可能不希望对中间结果使用
字符串。StringBuilder将更快。

简短的回答是肯定的。。。递归通常在树的下一级进行,在本例中,计算出每一级的位为空或当前字符。因此,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语句上递归,我为最后一级添加了一个特例。如果您要将其拆分,并将此级别的答案放入局部变量(例如tmp),则您将使用:

return tmp + deathToX(str.substring(1));
记住递归意味着当前执行只会暂停,直到较低的执行完成,这样您就可以愉快地存储信息,以便在备份过程中恢复。希望这有帮助:)

公共类解决方案{
//返回更改的字符串
公共静态字符串移除(字符串输入){
if(input.equals(“”)| input.equals(“”)x)
返回“”;
字符串returnStr=“”;
removeX(input.substring(1));

对于(int i=0;这是一个家庭作业吗?如果你在解决问题的方法上不受限制,那么有很多更简单、更有效的方法可以做到这一点。不,不是家庭作业。我只是想练习编写递归方法,所以这些限制是自我强加的。尽管我知道如果我不做,这是一个更容易解决的问题我不确定在这个新版本中是否使用了
newStr
。我本来打算编辑你的解决方案,但后来我看到其他人做了更改,你在第二次编辑中又添加了
newStr
,所以我决定把它留给你。我不确定这个社交协议是如何运作的路易斯瓦瑟曼:老实说,当我添加评论时,我怀疑这只是一个编辑交叉的问题。
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;
    }
}