这可以仅通过递归来完成吗?

时间:2012-12-01 23:35:02

标签: java recursion

我遇到了this CodingBat递归问题:

  

给定一个字符串,递归返回一个“已清理”的字符串,其中相同的相同字符已减少为单个字符。所以“yyzzza”会产生“yza”。

stringClean("yyzzza") → "yza"
stringClean("abbbcdd") → "abcd"
stringClean("Hello") → "Helo"

我可以使用循环来解决它,但这是不允许的,因为问题应该是使用递归来解决的。有没有办法解决这个问题而不使用循环并只使用递归?没有全局变量,没有循环。我甚至想过在参数中编码一些信息,但我认为这也是作弊。

我以前的程序没有while循环,我只能得到一半的答案。基本上,当我使用字符串参数调用我的函数时,我检查了前2个字符。如果它们是相同的,我将返回该字符并再次使用两个字符小的字符串调用该函数。但是,相同连续字符中的3个或4个字符串总是会使我的算法失败。

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) );

}

4 个答案:

答案 0 :(得分:6)

  

我的问题如下,有没有办法在不使用循环和仅使用递归的情况下解决此问题。没有全局变量,没有循环。

答案:是的。这很简单。请尝试以下:

 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(“Hello Bookkeeper”)→“Helo Bokeper”“Helo Bokeper”确定
  其他测试确定

答案 1 :(得分:1)

  

我的问题如下,有没有办法在不使用循环和仅使用递归的情况下解决此问题。没有全局变量,没有循环。

答案是"是的,有可能"。

提示:

  • 喜欢大多数"棘手"递归问题这需要额外的参数。
  • 将问题视为在每个阶段过滤字符串的第一个字符。
  • 输入字符串的第一个字符是特殊情况......

答案 2 :(得分:0)

public String stringClean(String str) {
    if (str == null) {
        return null;
    } else if (str.length() > 1) {
        String k = str.substring(0, 1);
        if (str.charAt(0) == str.charAt(1)) {
            String tmp = stringClean(str.substring(2));
            return k + stringClean(tmp);
        } else {
            return k + stringClean(stringClean(str.substring(1)));
        }
    } else {
        return str;
    }
}

答案 3 :(得分:0)

这是我的答案

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));

}