Java中字符的递归删除
作为练习,下面的代码块打算递归地遍历字符串并删除所有“x”字符。它可以做到这一点,但我希望跟踪newStr,而不将其作为方法中的参数传递。是否仍然需要将其移动到方法体中 谢谢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 {
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;
}
}