Java 这只能通过递归实现吗?
我被困在编码BAT递归问题上: 给定一个字符串,递归返回一个“清理”字符串,其中相同的相邻字符已减少为单个字符。所以“yyzza”产生“yza” 我可以用循环来解决它,但这是不允许的,因为这个问题应该用递归来解决。有没有办法不使用循环而只使用递归来解决这个问题?没有全局变量,没有循环。我甚至想过在参数中编码一些信息,但我认为这也是作弊 我以前的程序没有while循环,我只能得到一半的正确答案。基本上,当我用string参数调用函数时,我检查了前2个字符。如果它们是相同的,我将返回该字符,并使用一个小两个字符的字符串再次调用该函数。然而,由3或4个相同连续字符组成的字符串总是会破坏我的算法Java 这只能通过递归实现吗?,java,recursion,Java,Recursion,我被困在编码BAT递归问题上: 给定一个字符串,递归返回一个“清理”字符串,其中相同的相邻字符已减少为单个字符。所以“yyzza”产生“yza” 我可以用循环来解决它,但这是不允许的,因为这个问题应该用递归来解决。有没有办法不使用循环而只使用递归来解决这个问题?没有全局变量,没有循环。我甚至想过在参数中编码一些信息,但我认为这也是作弊 我以前的程序没有while循环,我只能得到一半的正确答案。基本上,当我用string参数调用函数时,我检查了前2个字符。如果它们是相同的,我将返回该字符,并使用一
public String stringClean(String str) {
if (str.length() == 0)
return "";
if (str.length() > 1) {
int counter = 1;
char a = str.charAt(0);
char b = str.charAt(1);
if (a == b)
{
while (str.length() > 1)
{
a = str.charAt(0);
b = str.charAt(1);
if (a != b) break;
counter++;
str = str.substring(1);
}
return a + stringClean( str.substring(1) ) ;
}
}
return str.charAt(0) + stringClean (str.substring(1) );
}
我的问题是,有没有办法不使用循环,只使用递归来解决这个问题。没有全局变量,没有循环
答案是“是的,这是可能的”
提示:
- 像大多数“棘手”的递归问题一样,这需要一个额外的参数
- 将问题想象为在每个阶段过滤字符串的第一个字符李>
- 输入字符串的第一个字符是一个特例
- 像大多数“棘手”的递归问题一样,这需要一个额外的参数
- 将问题想象为在每个阶段过滤字符串的第一个字符李>
- 输入字符串的第一个字符是一个特例
public String stringClean(String str) {
if (str.length() == 0)
return "";
if (str.length() == 1)
return str;
if(str.charAt(0) == str.charAt(1)){
return stringClean(str.substring(1));
}else{
return str.charAt(0)+ stringClean(str.substring(1));
}
}
您的CodingBat结果如下:
stringClean(“yyzzza”)→ “yza”“yza”正常stringClean(“abbbcdd”)→ “abcd”“abcd”正常
stringClean(“你好”)→ “Helo”“Helo”正常
stringClean(“XXabcYY”)→ “XabcY”“XabcY”正常
stringClean(“112ab445”)→ “12ab45”“12ab45”正常
stringClean(“你好,簿记员”)→ “Helo Bokeper”“Helo Bokeper”OK
其他测试OK 我的问题是,有没有办法不使用循环,只使用递归来解决这个问题。没有全局变量,没有循环 回答:是的。很简单。请尝试以下内容:
public String stringClean(String str) {
if (str.length() == 0)
return "";
if (str.length() == 1)
return str;
if(str.charAt(0) == str.charAt(1)){
return stringClean(str.substring(1));
}else{
return str.charAt(0)+ stringClean(str.substring(1));
}
}
您的CodingBat结果如下:
stringClean(“yyzzza”)→ “yza”“yza”正常stringClean(“abbbcdd”)→ “abcd”“abcd”正常
stringClean(“你好”)→ “Helo”“Helo”正常
stringClean(“XXabcYY”)→ “XabcY”“XabcY”正常
stringClean(“112ab445”)→ “12ab45”“12ab45”正常
stringClean(“你好,簿记员”)→ “Helo Bokeper”“Helo Bokeper”OK
其他测试OK 这是我的答案
public String stringClean(String str) {
if(str.isEmpty()) return "";
if(str.length()==1)return str;
if(str.length() > 1 && !str.substring(0,1).equals(str.substring(1,2)))
return str.substring(0,1) + stringClean(str.substring(1));
return ""+stringClean(str.substring(1));
}
这是我的答案
public String stringClean(String str) {
if(str.isEmpty()) return "";
if(str.length()==1)return str;
if(str.length() > 1 && !str.substring(0,1).equals(str.substring(1,2)))
return str.substring(0,1) + stringClean(str.substring(1));
return ""+stringClean(str.substring(1));
}
是的,只使用递归就可以解决这个问题。我会给你一个提示,你应该创建一个助手方法,它包含两个参数:前一个字符和剩余的字符串。我将提示您应该创建一个helper方法,该方法包含两个参数:前一个字符和剩余的字符串。这是我应该做的。谢谢你,伙计!当然,在结尾处发送字符。这是我应该做的。谢谢你,伙计!