作为练习,下面的代码块打算递归遍历一个字符串并删除所有的“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", ""));
}
答案 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”,如果它存在于字符串中,则将继续,否则,它将继续。将其余字符附加到该字符串,然后继续。 最后返回更新后的字符串。 希望这可以帮助..!!好吧,这是我在这里的第一个贡献:)