【问题标题】:Recursive removal of characters in JavaJava中字符的递归删除
【发布时间】:2012-02-27 11:48:56
【问题描述】:

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

【问题讨论】:

  • 这是家庭作业吗?如果您解决问题的方法不受限制,有许多更简单、更有效的方法可以做到这一点。
  • 不,不是作业。我只是想练习编写递归方法,所以限制是自我强加的。虽然我知道如果我不把它写成递归方法,这是一个更容易解决的问题。

标签: java methods recursion character


【解决方案1】:

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

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 在这个新版本中是否被使用。
  • 我打算编辑您的解决方案,但后来我看到其他人已经完成了该更改,并且您在第二次编辑中添加了 newStr...所以我决定保留它给你。我并不肯定这种社交协议在 SO 上的运作方式......
  • @LouisWasserman:老实说,我怀疑这只是编辑交叉的问题,而我正在添加 cmets。
【解决方案2】:

我想在不将 newStr 作为参数传递给方法的情况下跟踪它。

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

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

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

顺便说一句,由于涉及复制,您可能不想将String 用于中间结果。 StringBuilder 会更快。

【讨论】:

    【解决方案3】:

    简短的回答是肯定的......通常在沿着树向下的过程中使用递归,在这种情况下,您可以计算出每个级别的位,在这种情况下为空白或当前字符。因此,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));
    

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

    【讨论】:

      【解决方案4】:
      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 作为最后一个字符串,它返回 ""(nothing),然后它检查整个子字符串是否有 "x",如果它存在于字符串中,它将继续,否则它会将剩余字符附加到该字符串并继续。 最后返回更新后的字符串。! 希望这可以帮助..!!好吧,这是我在这里的第一个贡献:)

      【讨论】:

        猜你喜欢
        • 2013-02-05
        • 2020-08-12
        • 1970-01-01
        • 2022-01-26
        • 2015-04-22
        • 2010-10-21
        相关资源
        最近更新 更多