Java 这只能通过递归实现吗?

Java 这只能通过递归实现吗?,java,recursion,Java,Recursion,我被困在编码BAT递归问题上: 给定一个字符串,递归返回一个“清理”字符串,其中相同的相邻字符已减少为单个字符。所以“yyzza”产生“yza” 我可以用循环来解决它,但这是不允许的,因为这个问题应该用递归来解决。有没有办法不使用循环而只使用递归来解决这个问题?没有全局变量,没有循环。我甚至想过在参数中编码一些信息,但我认为这也是作弊 我以前的程序没有while循环,我只能得到一半的正确答案。基本上,当我用string参数调用函数时,我检查了前2个字符。如果它们是相同的,我将返回该字符,并使用一

我被困在编码BAT递归问题上:

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

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

我以前的程序没有while循环,我只能得到一半的正确答案。基本上,当我用string参数调用函数时,我检查了前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) );

}
我的问题是,有没有办法不使用循环,只使用递归来解决这个问题。没有全局变量,没有循环

答案是“是的,这是可能的”

提示:

  • 像大多数“棘手”的递归问题一样,这需要一个额外的参数
  • 将问题想象为在每个阶段过滤字符串的第一个字符
  • 输入字符串的第一个字符是一个特例
我的问题是,有没有办法不使用循环,只使用递归来解决这个问题。没有全局变量,没有循环

答案是“是的,这是可能的”

提示:

  • 像大多数“棘手”的递归问题一样,这需要一个额外的参数
  • 将问题想象为在每个阶段过滤字符串的第一个字符
  • 输入字符串的第一个字符是一个特例
我的问题是,有没有办法不使用循环,只使用递归来解决这个问题。没有全局变量,没有循环

回答:是的。很简单。请尝试以下内容:

 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方法,该方法包含两个参数:前一个字符和剩余的字符串。这是我应该做的。谢谢你,伙计!当然,在结尾处发送字符。这是我应该做的。谢谢你,伙计!